前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud集成Nacos实现服务发现和配置管理

SpringCloud集成Nacos实现服务发现和配置管理

作者头像
麦洛
发布2021-03-23 15:34:03
1.6K0
发布2021-03-23 15:34:03
举报

SpringCloud集成Nacos实现服务发现

1. 服务发现

本章节我通过在SpringCloud中写服务者(Provider,端口:9001)、消费者(Consumer,端口:9002),来演示服务发现。

服务发现原理

服务中消费者、服务提供者都需要添加这个依赖:

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> 

1.1. 服务提供者-Provider

编写这个,我们基于 SpringCloud集成Nacos实现配置管理[1] 中的案例来改造

1.1.1. 添加POM依赖包

代码语言:javascript
复制
<dependencies>
    <!--通用包依赖,一些Entity、Dao等-->
    <dependency>
        <groupId>xyz.wongs.weathertop</groupId>
        <artifactId>persistence-domain</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!--Nacos配置中心-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!--步骤1、这是新增:Nacos服务发现-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies> 

1.1.2. resources文件夹

1.1.2.1. bootstrap.properties文件
代码语言:javascript
复制
//步骤2、服务名改一下
spring.application.name=discovery-nacos-provider

spring.profiles.active=dev
spring.cloud.nacos.config.group=CLOUD_GROUP
spring.cloud.nacos.config.server-addr=192.168.147.132:8848
spring.cloud.nacos.config.prefix=${spring.application.name}
spring.cloud.nacos.config.file-extension=yml
management.endpoints.web.exposure.include=*
//步骤3、新增配置
spring.cloud.nacos.discovery.server-addr=192.168.147.132:8848 
1.1.2.2. application.yml文件

这里设定端口9001

代码语言:javascript
复制
server:
  port: 9001

mybatis:
  mapperLocations: classpath:mapper/**/*.xml 

1.1.3. 新增配置项

将Data Id中cofig-nacos-dev.yml配置复制一份,重命名为discovery-nacos-provider-dev.yml。

discovery-nacos-provider-dev.yml

1.1.4. 应用入口

代码语言:javascript
复制
@RefreshScope
@MapperScan(basePackages = {"xyz.wongs.weathertop.**.mapper"})
@EnableDiscoveryClient
@SpringBootApplication
public class DiscoveryProviderApp {
    public static void main(String[] args) {
        SpringApplication.run(DiscoveryProviderApp.class,args);
    }
} 

1.1.5. 启动项目

在浏览器打开地址:http://localhost:9001/locations/0[2]

验证服务

生产者启动成功

再打开Nacos控制台“服务管理->服务列表”,有discovery-nacos-provider这个服务名,说明服务已经注册到Nacos。

服务提供者

1.2. 源码

消费者Github演示源码[3] ,记得给Star

2. 服务消费者

2.1. resources文件夹

2.1.1. bootstrap.properties

代码语言:javascript
复制
spring.application.name=discovery-nacos-consumer
spring.profiles.active=dev
spring.cloud.nacos.discovery.server-addr=192.168.147.132:8848
management.endpoints.web.exposure.include=* 

2.1.2. application.yml

我们设定端口9002

代码语言:javascript
复制
server:
  port: 9002 

2.2. Bean注册

我们利用SpringBoot管理Bean的便捷性,来对RestTemplate实例进行管理,利用它的LoadBalanced注解来实现负载均衡。

代码语言:javascript
复制
@EnableDiscoveryClient
@SpringBootApplication
public class DiscoveryConsumerrApp {
    public static void main(String[] args) {
        SpringApplication.run(DiscoveryConsumerrApp.class,args);
    }

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
} 

2.3. 调用生产者

代码语言:javascript
复制
@RestController
@RequestMapping(value = "/locations")
public class LocationController extends BaseController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping(value = "/consumer/{lv}")
    public ResponseResult echo(@PathVariable(value = "lv") Integer lv) {
        return restTemplate.getForObject("http://discovery-nacos-provider/locations/" + lv, ResponseResult.class);
    }
} 

restTemplate.getForObject(String url, ClassresponseType, Object... uriVariables)

  • url:地址名,这里一定要填写Nacos服务列表中的服务名
  • responseType:返回数据类型,由于我使用了统一类型来返回数据,这里大家根据实际内容自行更改

2.4. 验证服务

打开浏览器,输入我们的地址:http://localhost:9002/locations/consumer/0[4] , 控制台中日志有刷新:

代码语言:javascript
复制
2019-12-15 18:19:53.140  INFO 22048 --- [tp2060799061-34] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client discovery-nacos-provider initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=discovery-nacos-provider,current list of Servers=[192.168.68.235:9001],Load balancer stats=Zone stats: {unknown=[Zone:unknown;   Instance count:1;   Active connections count: 0;    Circuit breaker tripped count: 0;   Active connections per server: 0.0;]
},Server stats: [[Server:192.168.68.235:9001;   Zone:UNKNOWN;   Total Requests:0;   Successive connection failure:0;    Total blackout seconds:0;   Last connection made:Thu Jan 01 08:00:00 CST 1970;  First connection made: Thu Jan 01 08:00:00 CST 1970;    Active Connections:0;   total failure count in last (1000) msecs:0; average resp time:0.0;  90 percentile resp time:0.0;    95 percentile resp time:0.0;    min resp time:0.0;  max resp time:0.0;  stddev resp time:0.0]
]}ServerList:org.springframework.cloud.alibaba.nacos.ribbon.NacosServerList@66588ff
2019-12-15 18:19:54.121  INFO 22048 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty  : Flipping property: discovery-nacos-provider.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647 

查看数据结果

2.5. 源码

消费者Github演示源码[5] ,记得给Star

SpringCloud集成Nacos实现配置管理

1. 简介

对Nacos在CentOS中的安装还了解的话,请参考CentOS环境下安装Nacos[6]。

在实际开发和运维支撑过程中,都遇到对服务中配置文件的管理,如果需要管理的配置文件数量较少,带来相关工作不是很多,当我们面对成百上千个配置文件需要管理,这想想都让人头疼,如果我们稍有不慎将文件改错、漏改以及配置不生效,瞬间让人怀疑人生。

所以面对此类场景,我们引入Nacos,在Nacos控制台上我们可以对健康状态管理,对服务治理,减轻分布式配置管理等方面的管控能力,以便进一步帮助用户降低管理微服务应用架构的成本。

2. 新建配置

2.1. data id规则

Nacos管理

打开Nacos管理页面,打开:配置管理=>配置列表,新建配置,对于Data ID我们约定命名规则是:

代码语言:javascript
复制
${prefix}-${spring.profile.active}.${file-extension} 

prefix 默认是spring.application.name,在SpringCloud中我们可以通过spring.cloud.nacos.config.prefix来配置

spring.profile.active当前环境对应的profile,通过spring.profile.active来配置

file-exetension为配置内容的数据格式,可以通过spring.cloud.nacos.config.file-extension来配置。截止当前只支持properties和yaml类型

代码语言:javascript
复制
当spring.profile.active未配置时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 {prefix}.{file-extension} 

2.2. 创建配置文件

bootstrap.yml/bootstrap.properties,而不是application.yml/application.properties,如果了解Springboot应该都知道,这bootstrap和application在项目启动中,加载顺序有先后的,bootstrap的优先级是高于application。

3. 添加依赖

因为Springboot最新2.1.X版本集成spring-cloud-alibaba-dependencies会有一些问题,所以SpringBoot版本需要降级到2.0.X,这也是个坑呀,折腾了好久。经过查阅一些资料,稳定版本的列表如下

Spring Cloud Version

Spring Cloud Alibaba Version

Spring Boot Version

Spring Cloud Greenwich

2.1.1.RELEASE

2.1.X.RELEASE

Spring Cloud Finchley

2.0.1.RELEASE

2.0.X.RELEASE

Spring Cloud Edgware

1.5.1.RELEASE

1.5.X.RELEASE

Spring Cloud Alibaba,包含了它所使用的所有依赖的版本。版本之间的依赖列表

  • Spring Cloud Greenwich

如果需要使用Spring Cloud Greenwich版本,在POM中的添加

代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.1.1.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency> 
  • Spring Cloud Finchley

如果需要使用Spring Cloud Finchley版本,在POM中的添加

代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.0.1.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency> 
  • Spring Cloud Edgware

如果需要使用Spring Cloud Edgware版本,在POM中的添加

代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>1.5.1.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency> 

3.1. 父级依赖

代码语言:javascript
复制
<properties>
    <java.version>1.8</java.version>
    <spring-boot.version>2.0.4.RELEASE</spring-boot.version>
    <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    <nacos.version>0.2.2.RELEASE</nacos.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${nacos.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement> 

3.2. 依赖

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency> 

4. resource文件

4.1. bootstrap.properties

由于bootstrap.properties在启动优先级高,所以将Nacos配置信息写这里。

代码语言:javascript
复制
spring.application.name=cofig-nacos
spring.profiles.active=dev
spring.cloud.nacos.config.group=CLOUD_GROUP
spring.cloud.nacos.config.server-addr=192.168.147.132:8848
spring.cloud.nacos.config.prefix=${spring.application.name}
spring.cloud.nacos.config.file-extension=yml 
  • spring.cloud.nacos.config.server-addr:IP:PORT,生产环境这个应该是代理IP或者nacos的域名
  • spring.cloud.nacos.config.group:指定你设置的组,默认为** DEFAULT_GROUP**

4.2. application.yml

代码语言:javascript
复制
server:
  port: 9002

# 5. mybatis配置
mybatis:
  mapperLocations: classpath:mapper/**/*.xml 

6. 案例

为更好演示Nacos配置中心的效果,我这里将数据库配置都写在Nacos中,项目启动过程中自动获取配置中心的属性。

  • Nacos控制台配置

Nacos新增DataID等信息

代码语言:javascript
复制
spring: 
    datasource: 
        name: mysql
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123456
        druid:
            initial-size: 5
            min-idle: 5
            max-active: 20
            max-wait: 30000
            ##配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            time-between-eviction-runs-millis: 2000
            ## 配置一个连接在池中最小生存的时间,单位是毫秒
            min-evictable-idle-time-millis: 300000
            max-evictable-idle-time-millis: 600000
            remove-abandoned: true
            remove-abandoned-timeout: 180
            log-abandoned: false
            validation-query: select 1
            test-while-idle: true
            test-on-borrow: true
            test-on-return: true
            keep-alive: true
            phy-timeout-millis: 500
            pool-prepared-statements: false
            max-pool-prepared-statement-per-connection-size: 20
            connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000
page:
    pageNum: 0
    pageSize: 20 
  • 启动类

@RefreshScope实现配置自动更新

代码语言:javascript
复制
@RefreshScope
@MapperScan(basePackages = {"xyz.wongs.weathertop.**.mapper"})
@SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class})
public class CloudConfigNacosApp {
    public static void main(String[] args) {
        SpringApplication.run(CloudConfigNacosApp.class,args);
    }

} 

7.Endpoint 信息查看

Springboot本身支持Endpoint,而Nacos Config同样也可以使用Endpoint来暴露信息。 在maven依赖中添加 spring-boot-starter-actuator依赖,并在配置中允许 Endpoints的访问。

  • Spring Boot 1.x 中添加配置 management.security.enabled=false
  • Spring Boot 2.x 中添加配置 management.endpoints.web.exposure.include=*
代码语言:javascript
复制
Spring Boot 1.x 可以通过访问 http://localhost:9001/nacos_config来查看Nacos Endpoint 的信息。

Spring Boot 2.x 可以通过访问http://localhost:9001/actuator/nacos-config来访问。 

查看Endpoint

8. 源码

Github演示源码[7] ,记得给Star

参考

[1]

SpringCloud集成Nacos实现配置管理: https://www.jianshu.com/p/f8cf6bb36107

[2]

http://localhost:9001/locations/0: https://links.jianshu.com/go?to=http%3A%2F%2Flocalhost%3A9001%2Flocations%2F0

[3]

消费者Github演示源码: https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fking-angmar%2Fweathertop%2Ftree%2Fmaster%2Fakkad-cloud%2Fcloud-discovery%2Fdiscovery-nacos-provider

[4]

http://localhost:9002/locations/consumer/0: https://links.jianshu.com/go?to=http%3A%2F%2Flocalhost%3A9002%2Flocations%2Fconsumer%2F0

[5]

消费者Github演示源码: https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fking-angmar%2Fweathertop%2Ftree%2Fmaster%2Fakkad-cloud%2Fcloud-discovery%2Fdiscovery-nacos-consumer

[6]

CentOS环境下安装Nacos: https://www.jianshu.com/p/9f695cf38cf3

[7]

Github演示源码: https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fking-angmar%2Fweathertop%2Ftree%2Fmaster%2Fakkad-cloud%2Fcloud-config-nacos

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 今日Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringCloud集成Nacos实现服务发现
  • 1. 服务发现
    • 1.1. 服务提供者-Provider
      • 1.1.1. 添加POM依赖包
      • 1.1.2. resources文件夹
      • 1.1.3. 新增配置项
      • 1.1.4. 应用入口
      • 1.1.5. 启动项目
    • 1.2. 源码
    • 2. 服务消费者
      • 2.1. resources文件夹
        • 2.1.1. bootstrap.properties
        • 2.1.2. application.yml
      • 2.2. Bean注册
        • 2.3. 调用生产者
          • 2.4. 验证服务
            • 2.5. 源码
            • SpringCloud集成Nacos实现配置管理
            • 1. 简介
            • 2. 新建配置
              • 2.1. data id规则
                • 2.2. 创建配置文件
                • 3. 添加依赖
                  • 3.1. 父级依赖
                    • 3.2. 依赖
                    • 4. resource文件
                      • 4.1. bootstrap.properties
                        • 4.2. application.yml
                          • 参考
                      • 6. 案例
                      • 7.Endpoint 信息查看
                      • 8. 源码
                      相关产品与服务
                      对象存储
                      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档