Springboot + nacos 实现注册中心和配置中心

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的配置中取出。
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值