欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

阿里微服务架构Spring Cloud Alibaba Nacos实战

程序员文章站 2022-03-14 09:49:17
...


nacos官方文档:https://nacos.io/zh-cn/docs/quick-start.html

1、常用特性

  • 服务发现和服务健康监测

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

  • 动态配置服务

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

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

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

  • 动态 DNS 服务

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

  • 服务及其元数据管理

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

2、注册中心、配置中心对比

注册中心对比

Nacos Eureka Consul CoreDNS Zookeeper
一致性协议 CP+AP AP CP CP
健康检查 TCP/HTTP/MYSQL/Client Beat Client Beat TCP/HTTP/gRPC/Cmd Keep Alive
负载均衡策略 权重/ metadata/Selector Ribbon Fabio RoundRobin
雪崩保护
自动注销实例 支持 支持 不支持 不支持 支持
访问协议 HTTP/DNS HTTP HTTP/DNS DNS TCP
监听支持 支持 支持 支持 不支持 支持
多数据中心 支持 支持 支持 不支持 不支持
跨注册中心同步 支持 不支持 支持 不支持 不支持
SpringCloud集成 支持 支持 支持 不支持 不支持
Dubbo集成 支持 不支持 不支持 不支持 支持
K8S集成 支持 不支持 支持 支持 不支持

配置中心对比

功能点 Spring Cloud Config Apollo Nacos
开源时间 2014.9 2016.5 2018.6
配置实时推送 支持(Spring Cloud Bus) 支持(HTTP长轮询1S内) 支持(HTTP长轮询1S内)
版本管理 支持(GIT) 支持 支持
配置回滚 支持(GIT) 支持 支持
灰度发布 支持 支持 不支持
权限管理 支持 支持 支持
集群 支持 支持 支持
多环境 支持 支持 支持
监听查询 支持 支持 支持
多语言 只支持Java GO、C++、Python、PHP、Java、.Net、OpenAPI Python、Java、.Net、OpenAPI、NodeJS
单机部署 config-server+Git+Spring Cloud Bus Apollo-quickstart+MySQL Nacos单节点
分布式部署 config-server(2)+Git+MQ(部署复杂) config(2)+Admin(2)+portal(2)+mysql(部署复杂) Nacos(2)+Mysql(部署简单)
配置格式校验 不支持 支持 支持
通信协议 Http和AMQP Http Http
数据一致性 Git保证一致性,config-server从git读取数据 数据库模拟消息队列,Apollo定时读消息 Http异步通知
单机读 7(限流所致) 9000 15000
单机写 5(限流所致) 1100 1800
3节点多 21(限流所致) 27000 45000
3节点写 5(限流所致) 3300 5600

总的来说,Apollo和Nacos相对于Spring Cloud Config的生态支持更广,在配置管理流程上做的更好。Apollo相对于Nacos在配置管理做的更加全面,不过使用起来也要麻烦一些。Nacos使用起来相对比较简洁,在对性能要求比较高的大规模场景更适合。

此外,Nacos除了提供配置中心的功能,还提供了动态服务发现、服务共享与管理的功能,降低了服务化改造过程中的难度。

3、生态图

阿里微服务架构Spring Cloud Alibaba Nacos实战

如 Nacos 全景图所示,Nacos 无缝支持一些主流的开源生态,例如

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

4、安装

下载地址:https://github.com/alibaba/nacos/releases

配置数据源:

修改nacos/conf/application.properties配置文件

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root

启动nacos/bin/startup.cmd或startup.sh,启动成功后访问 http://127.0.0.1:8848/nacos

用户名密码:nacos/nacos

docker安装

详细参数配置:https://nacos.io/zh-cn/docs/quick-start-docker.html

docker search nacos

docker pull nacos/nacos-server

docker run -d \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=62.234.0.169 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=Leimingtech1205 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-p 8848:8848 \
--restart=always \
--name lm-nacos \
nacos/nacos-server

启动成功后访问 http://127.0.0.1:8848/nacos

用户名密码:nacos/nacos

5、名词解析

命名空间(namespace)、配置集 ID(dataId)、配置分组(Group)

https://nacos.io/zh-cn/docs/concepts.html

6、代码实战

注册中心

首先代码演示一下使用Nacos作为服务注册中心。

版本信息

Spring Boot Spring Cloud Spring Cloud Alibaba
2.1.12.RELEASE Greenwich.SR5 2.1.0.RELEASE

添加依赖

在pom.xml中添加对应依赖。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>Greenwich.SR5</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.1.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

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

配置文件

在application.yml中配置nacos信息

spring:
  cloud:
    nacos:
      discovery:
        metadata:
          management:
            context-path: ${server.servlet.context-path}/actuator
        server-addr: ${nacos-host:@aaa@qq.com}:${nacos-port:@aaa@qq.com}
        #nacos的命名空间ID,默认是public
        namespace: ${nacos-namespace:public}

nacos-host、nacos-port、nacos-namespace可以配置为环境变量

nacos.server.ip、nacos.server.port在pom.xml中定义

注解

启动类上增加@EnableDiscoveryClient注解,有心者肯定能观察到@EnableDiscoveryClient也是Eureka使用的注解,因此Nacos便可以无缝替换Eureka。

验证工作

按照上面步骤进行操作,启动项目,启动完成后进入nacos平台,在【服务管理-服务列表】可进行查看。同时在详情中支持对任务手动下线,复制调试代码等操作。
阿里微服务架构Spring Cloud Alibaba Nacos实战

配置中心

Nacos可以做为配置中心,替换Apollo、Spring Cloud Config等配置中心。

前置工作

我们需要提前在Nacos管理界面创建好配置信息,在【配置管理-配置列表】下新建配置文件。配置文件格式支持(TEXT、JSON、XML、YAML、HTML、Properties)
阿里微服务架构Spring Cloud Alibaba Nacos实战
在 Nacos Spring Cloud 中,dataId 的完整格式如下:

prefix{prefix}-{spring.profile.active}.${file-extension}

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

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

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
}

添加依赖

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

配置文件

【注】Nacos作为配置中心,相关配置文件必须写在bootstrap.yml/bootstrap.properties中
bootstrap配置文件加载优先级高于application配置文件。
bootstrap.yml配置如下:

spring:
  cloud:
    nacos:
      discovery:
        metadata:
          management:
            context-path: ${server.servlet.context-path}/actuator
        server-addr: ${nacos-host:@aaa@qq.com}:${nacos-port:@aaa@qq.com}
        #nacos的命名空间ID,默认是public
        namespace: ${nacos-namespace:public}
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        namespace: ${spring.cloud.nacos.discovery.namespace}
        group: LM_SYS_SERVER_GROUP
        file-extension: properties
        #指定共享配置,且支持动态刷新
        ext-config:
          - data-id: mybatis-plus-common.yaml
            group: COMMON_GROUP
            refresh: true
          - data-id: other-common.yaml
            group: COMMON_GROUP
            refresh: true
          - data-id: rabbitmq-common.yaml
            group: COMMON_GROUP
            refresh: true
          - data-id: redis-common.yaml
            group: COMMON_GROUP
            refresh: true

验证
配置完成后,启动项目并查看启动日志,如果发现类似以下日志代表配置成功。

2020-07-14 11:31:27.300  INFO 9120 --- [           main] c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'mybatis-plus-common.yaml', group: 'COMMON_GROUP'
2020-07-14 11:31:27.306  INFO 9120 --- [           main] c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'other-common.yaml', group: 'COMMON_GROUP'
2020-07-14 11:31:27.309  INFO 9120 --- [           main] c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'rabbitmq-common.yaml', group: 'COMMON_GROUP'
2020-07-14 11:31:27.313  INFO 9120 --- [           main] c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'redis-common.yaml', group: 'COMMON_GROUP'
2020-07-14 11:31:27.317  INFO 9120 --- [           main] c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'leimingtech-sys-server-dev.properties', group: 'LM_SYS_SERVER_GROUP'
2020-07-14 11:31:27.319  INFO 9120 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-leimingtech-sys-server-dev.properties'}, BootstrapPropertySource {name='bootstrapProperties-leimingtech-sys-server.properties'}, BootstrapPropertySource {name='bootstrapProperties-redis-common.yaml'}, BootstrapPropertySource {name='bootstrapProperties-rabbitmq-common.yaml'}, BootstrapPropertySource {name='bootstrapProperties-other-common.yaml'}, BootstrapPropertySource {name='bootstrapProperties-mybatis-plus-common.yaml'}]
2020-07-14 11:31:27.364  INFO 9120 --- [           main] com.leimingtech.AdminApplication         : The following profiles are active: dev
相关标签: Spring Cloud