20.SpringCloudAlibaba Nacos(服务注册于配置中心)
Nacos:前四个字母分别是Naming和Configuration的前两个字母,最后的s是Service
是什么呢?
一个更易于构建云原生的动态服务发现、配置管理和服务管理平台
Nacos就是注册中心+配置中心的结合
等价于 Nacos=Eureka(服务注册中心)+Config(服务配置中心)+Bus(服务总线)
1.Nacos的下载安装
下载安装参考网上
安装成功后,登录:http://192.168.2.129:8848/nacos出现下面页面
默认登录账号和密码:nacos/nacos
2.Nacos服务端和客户端搭建
1.参考官网:https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html
步骤:
1.在父项目中引入:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
2.创建两个服务提供端,代码都一样,只是端口分别为9001/9002
2.1 pom文件中引入的特别除:
1:引入nacos
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.引入web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3.引入监控
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.2在application.yml中的配置
server:
port: 9001
spring:
application:
name: nacos-person-provider
#重点1:绑定nacos的地址
cloud:
nacos:
discovery:
server-addr: 192.168.2.129:8848
#重点2:暴露所有端点
management:
endpoints:
web:
exposure:
include: '*'
2.3 控制层代码,提供生成uuid的方法
@RestController
public class PersonController {
重点1:获取服务端口,因为有两个服务端,为后面演示的负载均衡做准备
@Value("${server.port}")
private int serverPort;
@GetMapping("/provider/getUUid/{id}")
public String getUUID(@PathVariable("id") int id){
return "alibaba服务提供端-->请求id:"+id+" UUID:"+ IdUtil.simpleUUID()+" 服务端口:"+serverPort;
}
}
2.4 启动类代码:
@SpringBootApplication
重点1:加上@EnableDiscoveryClient注解:让注册中心可以发现该服务,扫描到该服务
@EnableDiscoveryClient
public class AlibabaPersonProviderApplication9002 {
public static void main(String[] args) {
SpringApplication.run(AlibabaPersonProviderApplication9002.class, args);
}
}
3.服务调用端代码:
3.1 pom文件的内容:
1:引入nacos
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.引入web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3.引入监控
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3.2 由下图知,spring-cloud-starter-alibaba-nacos-discovery包中包含有netflix的ribbon,所以肯定支持负载均衡和restTemplate远程请求
3.3 config配置类代码:
@Configuration
public class Myconfig {
重点1:容器中加入RestTemplate组件,并使用@LoadBalanced注解,使进行轮训的负载均衡
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
3.4applicaiton.yml配置文件代码:
server:
port: 81
spring:
application:
name: nacos-person-consumer
#重点1:绑定nacos的地址
cloud:
nacos:
discovery:
server-addr: 192.168.2.129:8848
重点2:自定义个key,值是服务注册中心中服务提供端的名称,即服务提供端的spring.appliaciton.name
server-url:
nacos-user-service: http://nacos-person-provider
3.4 控制层代码
@RestController
public class PersonConsumerController {
重点1:获取RestTemplate对象
@Resource
private RestTemplate restTemplate;
重点2:获取远程服务的nacos地址,从配置文件中获取,做到配置和代码分离
@Value("${server-url.nacos-user-service}")
private String uri;
@GetMapping("/consumer/getUUID/{id}")
public String getUUId(@PathVariable("id") int id){
return restTemplate.getForObject(uri+"/provider/getUUid/"+id,String.class);
}
}
测试:当浏览器输入客户端请求:http://localhost:81/consumer/getUUID/5时
页面轮询出现:发现端口轮询,即两个服务提供端轮询提供服务
alibaba服务提供端-->请求id:5 UUID:5440c99cb2624e37979c5fe2700bee70 服务端口:9001
alibaba服务提供端-->请求id:5 UUID:d2151e99b0154fd1ac469c72a961f773 服务端口:9002
..