侧边栏壁纸
博主头像
码森林博主等级

一起走进码森林,享受编程的乐趣,发现科技的魅力,创造智能的未来!

  • 累计撰写 145 篇文章
  • 累计创建 73 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Nacos(6):Spring Cloud 集成 Nacos

码森林
2022-01-19 / 0 评论 / 0 点赞 / 543 阅读 / 9,776 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-01-19,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

本文主要介绍 Spring Cloud 集成 Nacos 实现服务注册发现和配置管理。

聚合项目构建

创建一个Maven项目,方便依赖版本管理:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.zwqh</groupId>
    <artifactId>spring-cloud-nacos</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
        <bootstrap.version>3.0.3</bootstrap.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    </properties>


    <dependencyManagement>
        <dependencies>
            <!-- spring cloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 用于解决 spring cloud 版本过高时默认不再加载 bootstrap 文件导致读取不到配置,nacos 无限拉取配置 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-bootstrap</artifactId>
                <version>${bootstrap.version}</version>
            </dependency>
            <!-- spring cloud alibaba -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- web -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring-boot.version}</version>
            </dependency>
        </dependencies>

    </dependencyManagement>

</project>

spring cloud 集成 nacos 实现服务注册发现

服务提供者

1、New Module,名为spring-cloud-nacos-provider,添加依赖如下:

<dependencies>
    <!-- web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Nacos 实现服务的注册与发现-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

2、启动类添加 @EnableDiscoveryClient 开启服务注册发现功能:

@SpringBootApplication
//启动服务发现
@EnableDiscoveryClient 
public class NacosProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApplication.class, args);
    }
}

3、在 application.properties 中配置 Nacos server 的地址及服务信息:

# 应用服务名称
spring.application.name=service-provider
# 应用服务端口
server.port=9080
# Nacos Server 地址
nacos.discovery.server-addr=127.0.0.1:8848

4、创建 EchoController 用于测试:

@RestController
public class EchoController {
    @GetMapping("/echo/{string}")
    public String echo(@PathVariable String string) {
        return "Hello," + string;
    }
}

5、启动项目

...
c.a.c.n.registry.NacosServiceRegistry    : nacos registry, DEFAULT_GROUP service-provider 192.168.20.77:9080 register finished
...

可以看到 service-provider 已完成注册到 Nacos Server~

6、访问测试

http://127.0.0.1:9080/echo/zwqh,返回内容如下:

Hello,zwqh

表示服务没问题~

服务消费者

1、New Module,名为spring-cloud-nacos-consumer,添加依赖如下:

 <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Nacos 实现服务的注册与发现-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

2、启动类添加 @EnableDiscoveryClient 开启服务注册发现功能:

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class, args);
    }

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

这里使用 RestTemplate 进行服务远程调用,添加@LoadBalanced 注解,开启 @LoadBalanced 与 Ribbon 的集成~

3、在 application.properties 中配置 Nacos server 的地址及服务信息:

# 应用服务名称
spring.application.name=service-consumer
# 应用服务端口
server.port=9081
# Nacos Server 地址
nacos.discovery.server-addr=127.0.0.1:8848

4、创建 TestController,使用 RestTemplate 进行服务间远程调用:

@RestController
public class TestController {

    private final RestTemplate restTemplate;

    @Autowired
    public TestController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping("/echo/{str}")
    public String echo(@PathVariable String str) {
        return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
    }
}

5、启动项目

访问 http://127.0.0.1:9081/echo/zwqh,返回内容如下:

Hello,zwqh

说明服务的远程调用是通的~

集成 OpenFeign 进行服务间远程调用

1、通常服务会单独封装api,发布到maven仓库后供消费者调用,所以这里我们创建一个封装的接口 Module,名为 spring-cloud-nacos-api,添加依赖如下:

<dependencies>
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>
</dependencies>

2、创建对接口类 EchoFacade:

@FeignClient(contextId = "echoFacade", value = "service-provider", path = "")
public interface EchoFacade {
    @GetMapping("/echo/{string}")
    String echo(@PathVariable String string);
}

3、在 spring-cloud-nacos-provider 模块添加依赖:

<dependency>
    <groupId>cn.zwqh</groupId>
    <artifactId>spring-cloud-nacos-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

4、EchoController 实现 EchoFacade 接口

@RestController
public class EchoController implements EchoFacade {

    @Override
    @GetMapping("/echo/{string}")
    public String echo(@PathVariable String string) {
        return "Hello," + string;
    }
}

5、在 spring-cloud-nacos-consumer 模块添加依赖:

<dependency>
    <groupId>cn.zwqh</groupId>
    <artifactId>spring-cloud-nacos-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

6、在 spring-cloud-nacos-consumer 启动类添加 @EnableFeignClients 启动 feign客户端:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"cn.zwqh.cloud.nacos.api"})
public class NacosConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class, args);
    }
}

7、创建测试类 FeignTestController:

@RestController
public class FeignTestController {

    @Resource
    private EchoFacade echoFacade;

    @GetMapping("/echo2/{str}")
    public String echo(@PathVariable String str) {
        return echoFacade.echo(str);
    }
}

8、分别启动 service-provider 和 service-consumer:

访问 http://127.0.0.1:9081/echo2/zwqh,返回内容如下:

Hello,zwqh

说明使用OpenFeign进行服务间远程调用是通的~

spring cloud 集成 nacos 实现配置管理

1、New Module,名为spring-cloud-nacos-config,添加依赖如下:

<dependencies>
    <!-- web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 用于解决 spring cloud 版本过高时默认不再加载 bootstrap 文件导致读取不到配置,nacos 无限拉取配置 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
    <!-- Nacos 实现服务的注册与发现-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- Nacos 实现配置的动态变更-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
</dependencies>

2、启动类添加 @EnableDiscoveryClient 开启服务注册发现功能:

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigApplication.class, args);
    }
}

3、在 bootstrap.properties 中配置:

# 应用服务 WEB 访问端口
server.port=9082
# 应用名称
spring.application.name=service-config

# nacos 配置 👉	可以只启用配置管理~~~~~

# nacos-server 用户名
spring.cloud.nacos.username=nacos
# nacos-server 密码
spring.cloud.nacos.password=nacos
# 指定nacos服务注册发现地址
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 指定当前服务在 nacos server 的命名空间,可用于区分环境
spring.cloud.nacos.discovery.namespace=dev
# 指定服务分组
spring.cloud.nacos.discovery.group=DEFAULT_GROUP

 
# 指定nacos配置管理地址
spring.cloud.nacos.config.server-addr=localhost:8848
# 指定配置文件dataId的后缀
spring.cloud.nacos.config.file-extension=yaml
# 指定nacos-server配置的命名空间,可用于区分环境
spring.cloud.nacos.config.namespace=dev
# 指定配置分组
spring.cloud.nacos.config.group=DEFAULT_GROUPspring.profiles.active=dev

👉 在 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 类型。

4、创建配置测试类 ConfigController:

@RestController
@RefreshScope
public class ConfigController {

    @Value("${custom.config.appid}")
    private String appid;

    @GetMapping("/getConfig")
    public String getConfig() {
        return appid;
    }
}

👉 通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新。

5、在 Nacos Server 中创建如下配置:

6、启动项目

访问http://127.0.0.1:9082/getConfig,返回内容如下:

123456

7、更新配置

更新配置内容为:

custom:
  config:
    appid: 654321

可以看到控制台日志如下:

o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [custom.config.appid]

说明配置已经实时刷新了~

再次访问http://127.0.0.1:9082/getConfig,返回内容如下:

654321

源码

github

码云

0

评论区