要使用nacos,咱們首先得下載它的服務端,下載地址https://github.com/alibaba/nacos/releasesgit
根據你的Spring Cloud Alibaba版原本下載須要使用的版本github
我這裏是tar.gz的,下載完成後,解壓,進入bin目錄web
執行sh startup.sh -m standalonespring
經過docker安裝nacos服務端docker
docker pull nacos/nacos-server:1.1.3瀏覽器
docker run -d --name nacos -p 8848:8848 --env MODE=standalone nacos/nacos-server:1.1.3app
而後經過瀏覽器訪問http://127.0.0.1:8848/nacos/負載均衡
此時界面如圖所示測試
輸入帳號nacos,密碼nacos後,進入管理界面ui
搭建一個Spring Cloud Alibaba項目,在父項目中,Springboot版本2.1.7,SpringCloud版本Greenwich.SR2,SpringCloudAlibaba版本2.1.1.RELEASE
<spring-cloud.version>Greenwich.SR2</spring-cloud.version> <spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
在具體的子項目中放入以下依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
添加配置
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: user
啓動項目,端口8080,在管理界面中能夠看到
咱們的項目已經被註冊進來了。如今咱們來建一個相似的項目,端口號8081,編寫一個測試Controller,來查找以前的user項目。
@RestController public class TestController { /** * 不管使用哪一種註冊中心(Eureka,Zookeeper,Consul),該DiscoveryClient是通用的 * 它是一個接口 */ @Autowired private DiscoveryClient discoveryClient; @GetMapping("/test") public List<ServiceInstance> findUser() { return discoveryClient.getInstances("user"); } }
運行後,訪問以下
若是user啓動多個實例,這裏也能夠獲取多個user的信息
如今咱們在user模塊中增長一個Controller,用另一個模塊使用RestTemplate來調用這個Controller.
@RestController public class TestController { @GetMapping("/find") public String findStr() { return "春秋一統"; } }
在調用模塊中使用RestTemplate來調用,咱們以前發如今discoveryClient.getInstances("user")返回List中有一個uri的屬性是咱們須要的,咱們再拼接上/find就是咱們須要的Rest API。
@Slf4j @Service public class ConnectServer { @Autowired private DiscoveryClient discoveryClient; private RestTemplate restTemplate = new RestTemplate(); @PostConstruct public void trace() { List<ServiceInstance> instances = discoveryClient.getInstances("user"); String targetUrl = instances.stream().map(instance -> instance.getUri().toString() + "/find") .findFirst() .orElseThrow(() -> new RuntimeException("當前沒有實例")); String result = restTemplate.getForObject(targetUrl, String.class); log.info(result); } }
運行結果(部分日誌)
2019-12-06 23:09:12.764 INFO 847 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 563 ms
2019-12-06 23:09:18.229 INFO 847 --- [ main] c.cgc.cloud.nacos.service.ConnectServer : 春秋一統
2019-12-06 23:09:18.235 WARN 847 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.
如今咱們要整合Ribbon來負載均衡
先在調用模塊加入咱們須要的Apache HTTPClient依賴
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
給RestTemplate增長鏈接池,鏈接次數和超時時間。再打上Ribbon特有的標籤@LoadBalanced
@Configuration public class RestTemplateConfig { @LoadBalanced @Bean public RestTemplate restTemplate() { PoolingHttpClientConnectionManager pollingConnectionManager = new PoolingHttpClientConnectionManager(); //鏈接池最大鏈接數 pollingConnectionManager.setMaxTotal(400); pollingConnectionManager.setDefaultMaxPerRoute(200); HttpClientBuilder httpClientBuilder = HttpClients.custom(); httpClientBuilder.setConnectionManager(pollingConnectionManager); //鏈接次數 httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)); HttpClient httpClient = httpClientBuilder.build(); HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory( httpClient); // 超時時間 clientHttpRequestFactory.setConnectTimeout(5000); clientHttpRequestFactory.setReadTimeout(5000); clientHttpRequestFactory.setConnectionRequestTimeout(5000); RestTemplate restTemplate = new RestTemplate(); restTemplate.setRequestFactory(clientHttpRequestFactory); restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); return restTemplate; } }
爲了以示區別,咱們在user模塊中修改第二個實例的返回字符串
@RestController public class TestController { @GetMapping("/find") public String findStr() { return "戰國一統"; } }
在調用模塊中增長測試Controller
@RestController public class BalanceController { @Autowired private RestTemplate restTemplate; @GetMapping("/trace") public String trace() { return restTemplate.getForObject("http://user/find", String.class); } }
啓動調用模塊
咱們不斷的點擊刷新,它就會不斷的出現春秋一統和戰國一統返回字符串。
Nacos的環境配置
咱們能夠在命名空間中設置咱們不一樣環境(好比開發,測試,線上等等)的配置,它們是相互隔離的,互不影響。
在項目中配置以下,加入咱們如今要把項目配置到開發環境中
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: 9257bc96-8af7-4737-9ce1-a63da2ba2af7 application: name: user
這裏須要注意的就是,咱們在填寫namespace的時候必定要配置它的命名空間ID,而不能配它的名稱,好比dev。
項目啓動後,咱們能夠看到咱們的服務如今是在dev的服務列表中.
咱們還能夠配置它到集羣中心
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: 9257bc96-8af7-4737-9ce1-a63da2ba2af7 cluster-name: GuangZhou application: name: user
啓動後,點擊詳情,能夠看到