SpringCloud Nacos服务注册和配置中心

微信扫一扫,分享到朋友圈

SpringCloud Nacos服务注册和配置中心

SpringCloud Nacos服务注册和配置中心


简介

1. 为什么叫Nacos :

前四个字母分别是Naming 和 Configuration 的前两个字母,最后的s为Service。

Nacos 就是注册中心 + 配置中心的组合

Nacos 官网 : nacos.io/zh-cn/

GitHub: github.com/alibaba/Nac…

  • Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

  • Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。


安装并运行nacos

在docker上安装nacos

拉取nacos镜像:

docker pull nacos/nacos-server
复制代码

运行nacos:

docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
复制代码

在浏览器输入:http://ip地址:8848/nacos/ 账号和密码都是nacos。



Nacos作为服务注册中心演示

官方文档: spring-cloud-alibaba-group.github.io/github-page…

提供者

  1. 新建模块cloudalibaba-provider-payment9001
  2. pom
<dependencies>
<!--SpringCloud Alibaba nacos-->
<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>
</dependencies>
复制代码
  1. yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: 120.92.164.250:8848  #配置的Nacos地址(本机的写localhost:8848,服务器的写IP地址)
management:
endpoints:
web:
exposure:
include: '*'
复制代码
  1. 主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
复制代码
  1. 新建controller包,包下新建PaymentController
@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;
}
}
复制代码
  1. 启动9001

消费者 (整合Feign)

  1. 新建 cloudalibaba-consumer-nacos-order83
  2. pom
<dependencies>
<!--SpringCloud Alibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.angenin.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</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>
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
复制代码
  1. 建yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: 120.92.164.250:8848  #配置的Nacos地址(本机的写localhost:8848,服务器的写IP地址)
#消费者要访问的微服务名称(成功注册进nacos的服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
复制代码
  1. 主启动类
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
}
复制代码
  1. 新建 feign包 ,包下新增接口 PaymentFeignService
@Component
@FeignClient(value = "nacos-payment-provider")
public interface PaymentFeignService {
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id);
}
复制代码
  1. 新建controller
@RestController
public class OrderNacosController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping("/consumer/payment/feign/nacos/{id}")
public String paymentInfo2(@PathVariable("id") Integer id){
return paymentFeignService.getPayment(id);
}
}
复制代码
  1. 启动

服务注册中心对比

Nacos全景图


Nacos和CAP(同时支持 cp + ap)



AP 和 CP的切换
A : 可用性 B:一致性 C: 分区容错性
  • C是所有节点在统一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应

如何选择模式:

  • 一般来说,如果不需要存储服务级别的信息且服务实例都是通过 nacos-client 注册,并且能够保持心跳上报,那么就可以选择AP 模式,当前主流的服务如 SpringCloud 和 Dubbo 服务,都适用与AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下支持注册临时节点
  • 如果需要在服务界别编辑 或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式,CP模式下则支持持久化实例,此时则是以Raft 协议为集群模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误

Nacos默认AP。

切换CP


Nacos作为服务配置中心演示

  1. 新建cloudalibaba-config-nacos-client3377
  2. pom
<dependencies>
<!-- nacos config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--SpringCloud Alibaba nacos-->
<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>
</dependencies>
复制代码
  1. yml

bootstrap.yml:

server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 120.92.164.250:8848 #Nacos服务注册中心地址(本机的写localhost)
config:
server-addr: 120.92.164.250:8848 #Nacos作为配置中心地址(本机的写localhost)
file-extension: yml #指定yml格式配置
复制代码

application.yml

spring:
profiles:
active: dev #表示开发环境
复制代码
  1. 启动类
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
复制代码
  1. 新建controller 包,ConfigClientController类
@RefreshScope   //支持Nacos的动态刷新功能
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}
复制代码
  1. 在Nacos中添加配置信息

官网: nacos.io/zh-cn/docs/…





7. 启动3377 浏览器输入:http://localhost:3377/config/info


实时刷新


Nacos作为配置中心——分类配置

实际开发中,通常一个系统会准备

  • dev开发环境
  • test测试环境
  • prod生产环境

Namespace+Group+DataID三者的关系

  1. 介绍

类似Java里面的package名和类名 最外层的nameSpace是可以用于区分部署环境的,Group和DataID逻辑是那个区分两个目标对象


Data ID 区分


Group 区分



Namespace方案




微信扫一扫,分享到朋友圈

SpringCloud Nacos服务注册和配置中心

百度真无线智能耳机曝光:形似AirPods 续航28小时

上一篇

华为会员中心全面开放合作,携手合作伙伴共筑会员生态

下一篇

你也可能喜欢

SpringCloud Nacos服务注册和配置中心

长按储存图像,分享给朋友