微服务使用NACOS(举例:nacos整合gateway)

导读:本篇文章讲解 微服务使用NACOS(举例:nacos整合gateway),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

微服务使用NACOS(举例:nacos整合gateway)

一,gateway启动服务发现

1.1 pom.xml

在gateway的依赖中引入spring-cloud-starter-alibaba-nacos-discovery

		<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>3.0.1</version>
        </dependency>

		<!--    暴露节点 监控系统健康情况    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

1.2 application.yml

在application.yml中暴露节点和使用nacos注册中心

server:
  port: 9001

spring:
  application:
    name: tools2-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:9000

management:
  endpoints:
    web:
      exposure:
        include: "*"

1.3 Application.java

最后在启动类中使用@EnableDiscoveryClient注解

package pers.lmc.tools2.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author lmc
 * @Description: TODO
 * @Create 2022-04-04 16:28
 * @version: 1.0
 */
@SpringBootApplication
@EnableDiscoveryClient
public class Gateway2Application {

    public static void main(String[] args) {
        SpringApplication.run(Gateway2Application.class, args);
    }
}

启动之后可以在NACOS的【服务管理】- 【服务列表】的默认public命名空间找到,分组默认为DEFAULT_GROUP

二,服务区分不同环境

由于我们的项目经常都会出现多种环境(dev,test,prod等等),在使用Eureka作为注册中心的时候,我们是部署了不同环境的eureka服务,每个环境对应一个注册中心。而在NACOS中,我们部署一个服务就好。

2.1 NACOS相关概念

命名空间

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

配置分组

Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。

2.2 在NACOS中创建新命名空间

在NACOS的【命名空间】中,选择右上角【新建命名空间】,创建新命名空间
在这里插入图片描述
在这里我创建了开发环境的命名空间devspace

2.3 修改Nacos客户端配置文件

application.yml

server:
  port: 9001

spring:
  application:
    name: tools2-gateway
  profiles:
    active: dev

management:
  endpoints:
    web:
      exposure:
        include: "*"

application-dev.yml

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:9000
        namespace: f92060d8-326f-483c-8bb7-c6dba0118b2c # 命名空间ID
        group: ${spring.profiles.active}  # 分组名

重新启动gateway服务,可以在NACOS服务列表中看到

在这里插入图片描述

三,使用配置中心

3.1 NACOS相关概念

配置

在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。

配置管理

系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。

配置项

一个具体的可配置的参数与其值域,通常以 param-key=param-value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。

配置集

一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

配置集 ID

Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。

3.2 gateway启动配置管理

3.2.1 pom.xml

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2021.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.1.1</version>
        </dependency>

3.2.2 bootstrap.yml

我们在使用Spring Cloud Config时都会使用bootstrap的文件名。Nacos和Spring Cloud Config一样,在项目初始化时,要保证先从配置中心进行拉取,拉取配置之后,才能保证项目的正常启动,也要使用bootstrap的配置文件名,否则读取不到配置。

bootstrap.yml

server:
  port: 9001

spring:
  application:
    name: tools2-gateway
  profiles:
    active: dev

management:
  endpoints:
    web:
      exposure:
        include: "*"

bootstrap-dev.yml

spring:
  cloud:
    nacos:
      server-addr: localhost:9000 # 当同时使用服务发现和配置管理时,未避免配置两次server-addr,可以将服务地址写在这里
      discovery:
        #        server-addr: localhost:9000
        namespace: f92060d8-326f-483c-8bb7-c6dba0118b2c # 命名空间ID
        group: ${spring.profiles.active}  # 组名
      config:
        #        server-addr: localhost:9000
        namespace: f92060d8-326f-483c-8bb7-c6dba0118b2c
        group: ${spring.profiles.active}
        file-extension: yaml  # 配置内容的数据格式

3.2.3 在NACOS创建dataID

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

在NACOS页面的【配置管理】 – 【配置列表】中,点击右上角【+】添加dataID,命名为 tools2-gateway-dev.yaml,如下所示:

在这里插入图片描述

3.2.4 创建测试接口

配置完毕后,我们就需要测试验证刚才的配置是否正确。可以通过在项目中创建接口验证,如下所示:

package pers.lmc.tools2.gateway.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author lmc
 * @Description: TODO
 * @Create 2022-04-05 17:36
 * @version: 1.0
 */
@RestController
@RefreshScope
public class TestController {

    @Value("${lmc.test:lmc}")
    private String test;

    @RequestMapping("test")
    public String test() {
        return test;
    }
}

创建完毕,启动项目,访问:http://localhost:9001/test,得到的结果为:

lmchh

在NACOS修改配置lmc.test为lmchhh,重新访问接口http://localhost:9001/test,得到结果:

lmchhh

即配置正确。

3.3 使用多个配置

前面的配置一个服务只对应了一个配置dataID,但在实际上我们一个服务的配置来源可能不止一处。例如上面gateway中,当前只有一个tools-gateway-dev.yaml指定了开发环境。但是,如果我想把路由也在NACOS配置,那这时候意味着,不管是dev,test还是prod环境都共用这个路由配置,这个时候就需要用到nacos的配置集。

3.3.1 在NACOS创建新的配置

在这里插入图片描述

3.3.2 bootstrap.yml

bootstrap-dev.yml

spring:
  cloud:
    nacos:
      server-addr: localhost:9000 # 当同时使用服务发现和配置管理时,未避免配置两次server-addr,可以将服务地址写在这里
      discovery:
        #        server-addr: localhost:9000
        namespace: 8628e5dd-a236-4016-b94f-565a001faf2f # 命名空间ID
        group: ${spring.profiles.active}  # 组名
      config:
        #        server-addr: localhost:9000
        namespace: 8628e5dd-a236-4016-b94f-565a001faf2f
        group: ${spring.profiles.active}
        file-extension: yaml  # 配置内容的数据格式
        extension-configs[0]:
          data-id: ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
          group: ${spring.profiles.active}
        extension-configs[1]:
          data-id: ${spring.application.name}.${spring.cloud.nacos.config.file-extension}
          group: public

3.3.3 创建测试接口

配置完毕后,我们就需要测试验证刚才的配置是否正确。可以通过在项目中创建接口验证,如下所示:

package pers.lmc.tools2.gateway.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author lmc
 * @Description: TODO
 * @Create 2022-04-05 17:36
 * @version: 1.0
 */
@RestController
@RefreshScope
public class TestController {

    @Value("${lmc.test:lmc}")
    private String test;
    @Value("${lmc.public:pub}")
    private String pub;

    @RequestMapping("test")
    public String test() {
        return test;
    }

    @RequestMapping("pub")
    public String pub() {
        return pub;
    }
}

创建完毕,启动项目,访问:http://localhost:9001/test 和 http://localhost:9001/pub,查看返回结果

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81606.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!