Springcloud + nacos 实现注册中心和配置中心
前言:
我们知道在当前微服务分布式的解决方案中,注册中心和配置中心,我们之前都是使用eureka和springcloud config ,但是eureka停更,config的易用性比较低,对git的依赖性太高。近几年阿里巴巴开源的 nacos 挺不错,cap三大定律可以切换,也可以和eureka一样高可用,并且整合起来比较简单,配置上也有可视化界面。我们来一个入门的小例子来了解下nacos。
首先我们要有1个可用的eureka服务端。使用docker搭建nacos的服务端环境。
可以看这篇文章,简单方便 。docker安装单机版nacos
我们的两个侧重点是注册中心和配置中心
官方文档 https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
nacos注册中心
概念介绍
注册中心主要涉及到三大角色:
服务提供者
服务消费者
注册中心
它们之间的关系大致如下:
各个微服务在启动时,将自己的网络地址等信息注册到注册中心,注册中心存储这些数据。
服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。
各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。
微服务网络地址发送变化(例如实例增加或IP变动等)时,会重新注册到注册中心。这样,服务消费者就无需人工修改提供者的网络地址了
在微服务分布式架构中,我们的服务可能会很多,并且ip不确定,这时候需要1个统一的组件帮助我们管理 每个服务的基本信息。比如 订单服务需要消费用户服务,假设为了高可用用户服务有20个,我们不可能把ip列出来,如果使用注册中心,订单服务根据用户服务的名字取到1个ip然后去访问。这是一种解耦的表现。注册中心也可以按照一定规则,进行服务名到ip的负载均衡。任何架构组件的出现都是为了解决一定问题,注册中心可以让我们方便的进行服务间访问。
代码实现
pom依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
操作springboot启动类
我们需要加上 @EnableDiscoveryClient 注解,表示开启服务发现客户端的相关配置
@SpringBootApplication
@EnableDiscoveryClient
public class NacosDemoApplication
编写application.peoperties类
加上 nacos服务端的地址 和 命名空间 以及分组,可以实现环境隔离
我们在服务端自定了新的命名空间为 dev ,这里我假设项目是属于用户服务,所以分组设置为 user
设置添加新命名空间
server.port=8081
spring.application.name=nacos-provide
# Nacos Server 启动监听的ip地址和端口
spring.cloud.nacos.discovery.server-addr=xx.114.xxx.233:8848
# 设置命名空间id 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。默认为 public
spring.cloud.nacos.discovery.namespace=dev
# 设置分组 默认为 DEFAULT_GROUP
spring.cloud.nacos.discovery.group=user
运行测试 查看服务端页面
启动完成,可以看到日志中有注册信息
再查看下服务端的页面,记得切换到dev的命令空间下
我们的单个服务注册成功了,注册多个服务也是同理。
我们复制一下代码,改下端口号。全部启动,这时候注册中心服务端的实例数变成了2
大功告成,服务注册功能很简单吧。
如何使用服务发现功能那?有了注册中心服务之间调用可以直接使用 服务名进行调用。
去看官方文档,例子都很简单。
nacos配置中心
pom依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
需要把我们的配置文件改下名 ,这个优先级比较高,外部加载 bootstrap.properties
server.port=8081
spring.application.name=nacos-provide
# 设置命名空间id 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
spring.cloud.nacos.config.namespace=dev
# 配置中心的地址
spring.cloud.nacos.config.server-addr=xx.114.xxx.233:8848
# 开启动态刷新
spring.cloud.nacos.config.refresh-enabled=true
spring.profiles.active=dev
我们需要在配置中心的页面上新建 配置
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 $ {spring.application.name}.$ {file-extension:properties} 为前缀的基础配置,还加载了dataid为 $ {spring.application.name}-$ {profile}.${file-extension:properties} 的基础配置
所以我们的dataid为 nacos-provide.properties 如果是yml也是同理
我们新建了两个,同时也实验一下 profile 粒度的控制
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826162604384.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L29zY2hpbmFfNDA3MzA4MjE=,size_16,color_FFFFFF,t_70#pic_center
样例代码
@SpringBootApplication
@RestController
public class NacosDemoApplication {
@Value(value = "${user.age}")
String age;
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosDemoApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" + userName + "; age: " + userAge);
}
}
测试运行
name从 配置文件中取出,age从 profile为dev的配置中取出。