14. SpringCloud Alibaba Nacos服务注册和配置中心
14.1 Nacos简介
14.1.1 为什么叫Nacos?
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。
14.1.2 是什么?
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos: Dynamic Naming and Configuration Service
Nacos就是注册中心 + 配置中心的组合. Nacos = Eureka+Config +Bus
14.1.3 能干嘛?
替代Eureka做服务注册中心,替代Config做服务配置中心
14.1.4 去哪下?
https://github.com/alibaba/Nacos
官方文档:
14.1.5 各种注册中心比较
据说 Nacos 在阿里巴巴内部有超过 10 万的实例运行,已经过了类似双十一等各种大型流量的考验
14.2 安装并运行Nacos
- 本地Java8+Maven环境已经OK
- 先从官网下载Nacos:https://github.com/alibaba/nacos/releases
- 解压安装包,直接运行bin目录下的startup.cmd
- 命令运行成功后直接访问http://localhost:8848/nacos 默认账号密码都是nacos
- 结果页面
14.3 Nacos作为服务注册中心演示
14.3.1 官方文档
14.3.2 基于Nacos的服务提供者
- 建Module—cloudalibaba-provider-payment9001
- POM
父POM
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
本模块POM
<dependencies> <!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- SpringBoot整合Web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--日常通用jar包配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
- YML
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: 192.168.174.128:8848 #配置Nacos地址 management: endpoints: web: exposure: include: '*'
- 主启动
@EnableDiscoveryClient @SpringBootApplication public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class, args); } }
- 业务类
@RestController public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id){ return "Nacos registry, serverPort: " + serverPort + "\t id" + id; } }
- 测试
访问: http://localhost:9001/payment/nacos/1 ,nacos服务注册中心+服务提供者9001都OK了
- 为了下一章节演示nacos的负载均衡,参照9001新建9002
或者取巧不想新建重复体力劳动,直接拷贝虚拟端口映射
14.3.3 基于Nacos的服务消费者
- 建Module—cloudalibaba-consumer-nacos-order83
- POM
<dependencies> <!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 引入自己定义的api通用包,可以使用Payment支付Entity --> <dependency> <groupId>com.atguigu.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <!-- SpringBoot整合Web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--日常通用jar包配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
为什么nacos支持负载均衡?
- YML
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: 192.168.174.128:8848 #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者) service-url: nacos-user-service: http://nacos-payment-provider
- 主启动
@EnableDiscoveryClient @SpringBootApplication public class OrderNacosMain83 { public static void main(String[] args) { SpringApplication.run(OrderNacosMain83.class,args); } }
- 业务类
@Configuration public class ApplicationContextBean { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
@RestController public class OrderNacosController { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; @GetMapping("/consumer/payment/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id) { return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class); } }
- 测试
查看nacos控制台
访问:http://localhost:83/consumer/payment/nacos/13
83访问9001/9002,轮询负载OK