简易的Spring-Cloud使用Nacos进行服务注册及配置

1.Nacos简介

什么是 Nacos?
服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的服务的发现、配置和管理:

Kubernetes Service

gRPC & Dubbo RPC Service

Spring Cloud RESTful Service

Nacos 的关键特性包括:

服务发现和服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API TODO查找和发现服务。

Nacos 提供实时健康检查,阻止服务向不健康的主机或服务实例发送请求。Nacos 支持传输层(PING 或 TCP)和应用层(如 HTTP、Redis、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘服务等)服务的健康检查,Nacos 提供了 agent 模式和服务端2种健康检查模式。Nacos 还提供统一的健康检查仪表盘,帮助您管理服务可用性及流量。

动态配置服务

动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

动态配置消除了配置变更时重新部署应用和服务的需要,让配置变得更加高效和敏捷。

配置中心化管理让无状态服务实现变得更简单,让服务按需弹性扩展变得更容易。

Nacos 提供了一个 简单易用的UI TODO 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、回滚配置以及客户进程配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地管理配置变更和控制配置变更的风险。

动态 DNS 服务

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险。

Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

服务及其元数据管理

Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 Metrics 统计数据。

Nacos 全景图
在这里插入图片描述
特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求
架构大图:通过清晰架构,让您快速进入 Nacos 世界
业务大图:利用当前特性可以支持的业务场景,及其最佳实践
生态大图:系统梳理 Nacos 和主流技术生态的关系
优势大图:展示 Nacos 核心竞争力
战略大图:要从战略到战术层面讲 Nacos 的宏观优势

Nacos 生态图
在这里插入图片描述
如 Nacos 全景图所示,Nacos 无缝支持一些主流的开源生态,例如

Spring Cloud
Apache Dubbo and Dubbo Mesh
Kubernetes and CNCF
使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。

关于如何在这些生态中使用 Nacos,请参考以下文档:

Nacos与Spring Cloud一起使用

Nacos与Kubernetes一起使用

Nacos与Dubbo一起使用

Nacos与gRPC一起使用

Nacos与Istio一起使用

2.配置nacos

Linux下的安装过程

3.nacos简易使用

在这里插入图片描述
配置好后,配置管理及服务管理里面的模块都会新增对应的空间
在这里插入图片描述
使用配置中心配置:
配置管理-配置列表-选择空间-新增
在这里插入图片描述
配置生产者的配置文件
将生产者服务端口配置为8081

在这里插入图片描述
配置消费者的配置文件
将消费者服务端口配置为8082

PS:这里DataID后面需要配置对应配置格式为后缀

4.项目配置

创建空的maven父项目
在这里插入图片描述
pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.whz</groupId>
    <artifactId>nacos</artifactId>
    <version>0.0.1</version>
    <name>nacos</name>
    <description>naocs</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.2.2.RELEASE</spring-boot.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
        <nacos.version>0.2.2.RELEASE</nacos.version>
        <nacos.config.version>0.2.2.RELEASE</nacos.config.version>
    </properties>
    
    <!--这里配置了生产者及消费者的模块 如果还未创建这两个项目先注释掉-->
    <modules>
        <module>consumer</module>
        <module>provide</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

创建生产者spring-boot项目
provide
pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.whz</groupId>
        <artifactId>nacos</artifactId>
        <version>0.0.1</version>
        <relativePath/>
    </parent>
    <artifactId>provide</artifactId>
    <version>0.0.1</version>
    <name>provide</name>
    <description>provide</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${nacos.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>${nacos.version}</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

bootstrap.yml

spring:
  application:
    name: nacos-provide
  cloud:
    nacos:
      discovery: #使用注册中心
        server-addr: nacos地址:端口
        namespace: 空间id
      config: #使用配置中心
        server-addr: nacos地址:端口
        file-extension: yaml
        prefix: nacos-provide
        namespace: 空间id
        group: DEFAULT_GROUP

ProvideApplication.java

@EnableDiscoveryClient
@RestController
@SpringBootApplication
@RefreshScope
public class ProvideApplication {

    @Value("${server.port}")
    private String port;

    @Value("${spring.application.name}")
    private String name;

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

    @GetMapping("/provide")
    public String provide() {
        return "服务提供者" + name + "," + port;
    }
}	

创建消费者spring-boot项目
consumer
pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.whz</groupId>
        <artifactId>nacos</artifactId>
        <version>0.0.1</version>
        <relativePath/>
    </parent>
    <artifactId>consumer</artifactId>
    <version>0.0.1</version>
    <name>consumer</name>
    <description>consumer</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${nacos.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>${nacos.version}</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

bootstrap.yml

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery: #使用注册中心
        server-addr: nacos地址:端口
        namespace: 空间id
      config: #使用配置中心
        server-addr: nacos地址:端口
        file-extension: yaml
        prefix: nacos-consumer
        namespace: 空间id
        group: DEFAULT_GROUP

ConsumerApplication.java

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsumerApplication {

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

    @Autowired
    private RestTemplate restTemplate;

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

    @GetMapping("/consumer")
    public String test1() {
        return restTemplate.getForObject("http://nacos-provide/provide",String.class);
    }

}

5.测试

启动两个项目发现在未配置端口时,两个项目并未使用默认端口8080而使用的配置中心配置后的8081及8082端口
在这里插入图片描述
服务列表中也有这两个服务的注册信息
在这里插入图片描述

测试服务调用情况
在这里插入图片描述

PS: 整个项目结构
在这里插入图片描述

Logo

开源、云原生的融合云平台

更多推荐