要使用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
启动后,点击详情,能够看到