springcloud-Nacos服务注册和配置中心01(十三)
Nacos简介
- 是什么
- 一个更易于构建云原生应用的动态服务发现, 配置和服务管理平台.
- 简单来说, 就是注册中心+配置中心的综合(Eureka+Config+Bus)
- 能干什么
- 替代Eureka做服务注册中心.
- 替代Config做服务配置中心.
- 下载
- 选用1.1.4版本: https://github.com/alibaba/nacos/releases/tag/1.1.4
- 下载后, 解压安装包, 直接运行bin目录下的startup.cmd文件.
- 命令运行成功后, 访问http://localhost:8848/nacos, 默认账号密码: nacos
- 各种注册中心的比较
Nacos作为服务配置中心
- 基于Nacos的服务提供者
- 新建Module: cloudalibaba-provider-payment9001
- pom
- 父pom
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
- 本模块pom
<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <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> <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> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> </dependencies>
- 父pom
- yml
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: '*'
- 主启动类: @EnableDiscoveryClient
@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("/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id) { return "nacos registry, serverPort: " + serverPort + "\t id: " + id; } }
- 测试
- nacos控制台
- nacos控制台
- 参照9001新建9002, 为负载均衡做准备.
- 基于Nacos的服务消费者
- 新建Module: cloudalibaba-consumer-nacos-order83
- pom
- alibaba nacos
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
- 为什么支持负载均衡
- 因为nacos中有ribbon组件.
- alibaba nacos
- yml
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost: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); } }
- 业务类
- config
@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
- controller
@RestController @Slf4j 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); } }
- config
- 测试
- 访问 http://localhost:83/consumer/payment/nacos/11
- 83访问9002/9001, 轮询负载成功.
- 访问 http://localhost:83/consumer/payment/nacos/11
- 服务注册中心对比
- Nacos全景生态图
- Nacos与其他注册中心详细对比
- Nacos支持AP和CP的切换.
- C是所有节点在同一时间看到的数据是一致的, 而A的定义是所有请求都会收到响应.
- 一般来说, 如果不需要存储服务级别的信息且服务实例是通过nacos-client注册, 并能够保持心跳上报, 那么就选择AP模式, 当前主流的服务如SpringCloud, Dubbo都适用于AP模式, AP模式为了服务的可能性而减弱了一致性, 因此AP模式下只支持注册临时实例.
- 如果需要在服务级别编辑或存储配置信息, 那么CP是必须, K8S服务和DNS服务则适用于CP模式.
- CP模式下支持注册持久化实例, 此时以Raft协议为集群运行模式, 该模式下注册实例之前必须先注册服务, 如果服务不存在, 则返回错误.
- 切换指令: curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'