Spring Cloud Alibaba 2.1.0.RELEASE 整合 Nocas Feign Webflux Gateway Sentinel等组件

                                    Spring cloud Alibaba

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

  • 服务限流降级:默认支持 Servlet、Feign、RestTemplate、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
  • 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

更多功能请参考 Roadmap

Spring Cloud Alibaba与Spring Boot、Spring Cloud 依赖关系:

Spring Cloud

Spring Cloud Alibaba

Spring Boot

Spring Cloud Greenwich

2.1.0.RELEASE

2.1.X.RELEASE

Spring Cloud Finchley

2.0.0.RELEASE

2.0.X.RELEASE

Spring Cloud Edgware

1.5.0.RELEASE

1.5.X.RELEASE

组件依赖关系:

Spring Cloud Alibaba

Sentinel

Nacos

RocketMQ

Dubbo

Seata

(毕业版本) 2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE

1.6.3

1.1.1

4.4.0

2.7.3

0.7.1

(孵化器版本) 0.9.0.RELEASE or 0.2.2.RELEASE or 0.1.2.RELEASE

1.5.2

1.0.0

4.4.0

2.7.1

0.4.2

(孵化器版本) 0.2.1.RELEASE or 0.1.1.RELEASE

1.4.0

0.6.2

4.3.1

(孵化器版本) 0.2.0.RELEASE or 0.1.0.RELEASE

1.3.0-GA

0.3.0

正式版本厂库迁移命名变更:

修改点

修改前

修改后

package name

org.springframework.cloud 前缀

com.alibaba.cloud 前缀

maven groupid

org.springframework.cloud

com.alibaba.cloud

      文档参考:Wiki

      @EnableDiscoveryClient 开启Spring Cloud的服务注册与发现,由于这里引入了spring-cloud-starter-alibaba-nacos-discovery模块,所以Spring Cloud Common中定义的那些/与服务治理相关的接口将使用Nacos的实现。

       注:Spring Cloud Greenwich.SR4 底层依赖升级至Spring Boot 2.1.10.RELEASE, @EnableDiscoveryClient不再需要,只需要DiscoveryClient 依赖,Spring Boot应用程序向服务发现服务器注册。

1.0 Nocas (https://nacos.io)

    Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。

Nacos 的关键特性包括:

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

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

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

  • 动态配置服务

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

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

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

Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

  • 动态 DNS 服务

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

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

  • 服务及其元数据管理

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

1.0.1下载安装测试

#注:根据组件依赖关系下载使用指定版本,本文使用Spring Cloud Alibaba 2.1.0.RELEASE版本,对应的Nacos 1.1.0版本(官网不建议使用,故升级至Nacos 1.1.3版本),请参考本文档时候,建议下载此版本;

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

Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone

Windows启动命令:
cmd startup.cmd或者双击startup.cmd运行文件

# 测试(默认端口 8848 , 默认登录用户名密码为:nacos)
http://127.0.0.1:8848/nacos/index.html

1.0.2 服务提供者

0. 创建Maven父工程(alibaba-nacos)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cloud.alibaba</groupId>
    <artifactId>alibaba-nacos</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <!--依赖版本号管理-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-boot.version>2.1.7.RELEASE</spring-boot.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
        <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
    </properties>
    <!--子模块 #创建子模块后引入即可-->
    <modules>
        <module>nacos-discovery-provider</module>
        <module>nacos-discovery-consumer</module>
        <module>nacos-discovery-consumer-feign</module>
        <module>nacos-discovery-consumer-webflux</module>
        <module>nacos-discovery-gateway-server</module>
        <module>nacos-config-client</module>
        <module>nacos-discovery-sentinel</module>
    </modules>
    <!--统一管理-->
    <dependencyManagement>
        <dependencies>
            <!-- spring boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 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-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>
        </dependencies>
    </dependencyManagement>
    <!--阿里云镜像-->
    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
    <!--构建工具-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

1. 创建Spring Boot应用(nacos-discovery-provider)

 

2. 加入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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.cloud.alibaba</groupId>
        <artifactId>alibaba-nacos</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.cloud.alibaba</groupId>
    <artifactId>nacos-discovery-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-discovery-provider</name>
    <description>nacos 服务提供方</description>

    <dependencies>
        <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>
        <!--Nacos的服务注册与发现模块-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project>

3. 创建应用主类加入@EnableDiscoveryClient注解

// @EnableDiscoveryClient开启Spring Cloud的服务注册与发现,由于这里引入了spring-cloud-starter-alibaba-nacos-discovery模块,所以Spring Cloud Common中定义的那些/与服务治理相关的接口将使用Nacos的实现。
@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosDiscoveryProviderApplication.class, args);
    }
}

4. 实现一个HTTP接口

@RestController
public class TestController {
    @Value("${server.port}")
    private Integer port;
    @GetMapping("/hello")
    public String hello(@RequestParam String name) {
        return "hello " + name + "  port:" + port;
    }
}

5. 配置服务名称和Nacos地址

spring:
  application:
    name: nacos-discovery-server
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.43.142:8848
server:
  port: 8000

6. 访问Nocas 服务列表是否加入成功

#项目工程启动后控制台打印如下内容,说明已经注册成功
nacos registry, nacos-discovery-provider 192.168.43.142:8000 register finished

1.0.3 服务调用者

1. 创建Spring Boot应用(nacos-discovery-consumer)

 

2. 加入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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.cloud.alibaba</groupId>
        <artifactId>alibaba-nacos</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.cloud.alibaba</groupId>
    <artifactId>nacos-discovery-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-discovery-consumer</name>
    <description>nacos 服务消费方</description>

    <dependencies>
        <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>
        <!--Nacos的服务注册与发现模块-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project>

3. 创建应用主类加入@EnableDiscoveryClient注解

// @EnableDiscoveryClient开启Spring Cloud的服务注册与发现,由于这里引入了spring-cloud-starter-alibaba-nacos-discovery模块,所以Spring Cloud Common中定义的那些/与服务治理相关的接口将使用Nacos的实现。
@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosDiscoveryProviderApplication.class, args);
    }
}

4. 实现一个HTTP接口

@RestController
public class TestController {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/test")
    public String test() {
        /*ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-discovery-provider");
        URI uri = serviceInstance.getUri();
        String forObject = restTemplate.getForObject(uri + "/hello?name=123", String.class);*/

        //通过服务名直接访问,需要RestTemplate支持@LoadBalanced
        //String forObject = restTemplate.getForObject("http://nacos-discovery-provider/hello?name=123", String.class);

        //获取元信息---》此方式需去掉RestTemplate上的@LoadBalanced注解
        RibbonLoadBalancerClient.RibbonServer ribbonServer = (RibbonLoadBalancerClient.RibbonServer) loadBalancerClient.choose("nacos-discovery-provider");
        NacosServer nacosServer = (NacosServer) ribbonServer.getServer();
        Map<String, String> metadata = nacosServer.getMetadata();
        System.out.println("元数据------>" + metadata);
        String forObject = restTemplate.getForObject(ribbonServer.getUri() + "/hello?name=123", String.class);
        return forObject;
    }
}

5. 配置服务名称和Nacos地址

spring:
  application:
    name: nacos-discovery-provider
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.43.142:8848
		metadata:
          name1: healthy1
		name2: healthy2
server:
  port: 8080

6. 访问Nocas 服务列表是否加入成功

#项目工程启动后控制台打印如下内容,说明已经注册成功
nacos registry, nacos-discovery-consumer 192.168.43.142:8080 register finished
# curl或者postman等工具发起访问
localhost:8080/test

1.0.4 部分说明

# 通过服务名直接访问,需要RestTemplate支持@LoadBalanced
String forObject = restTemplate.getForObject("http://nacos-discovery-provider/hello?name=123", String.class);
# RestTemplate加@LoadBalanced注解
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
	return new RestTemplate();
}
# 元数据配置
metadata:
          name1: healthy1
		name2: healthy2
# @EnableDiscoveryClient
@EnableDiscoveryClient开启Spring Cloud的服务注册与发现,由于这里引入了spring-cloud-starter-alibaba-nacos-discovery模块,所以Spring Cloud Common中定义的那些/与服务治理相关的接口将使用Nacos的实现。

# idea使用中启动应用的多实例(-Dserver.port=端口号)
vm options: -Dserver.port=8001

1.0.5 动态配置

1. 创建Spring Boot应用(nacos-config-client)

2. 加入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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.cloud.alibaba</groupId>
        <artifactId>alibaba-nacos</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.cloud.alibaba</groupId>
    <artifactId>nacos-config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-config-client</name>
    <description>nacos 配置中心</description>

    <dependencies>
        <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>
        <!--Nacos分布式配置模块-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>
</project>

3. 创建应用主类加入@EnableDiscoveryClient注解

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

4. 实现一个HTTP接口

@RefreshScope
@RestController
public class TestController {
    @Value("${test:ceshi}")
    private String str;
    @GetMapping("/test")
    public String test() {
        return str;
    }
}

5. 创建bootstrap.yml(application.yml同级可替换)并配置

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      config:
        server-addr: 192.168.43.142:8848
server:
  port: 9094

6. Nacos配置管理

# 新建配置
nacos-config-client.properties   配置格式:Properties   配置内容:test=hehe
# nacos默认加载的是nacos-config-client.properties文件,如果需要加载yml
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml
server:
  port: 9094
# file-extension: yml 默认为properties,修改为yml
# 新建配置nacos-config-client.yml 配置格式:YAML 配置内容:test: Xiaoming
# 注意如上配置内容:后面的空格,在nacos配置内容编辑中有语法高亮显示;

7. 部分说明

# 官方解释
# 在命名空间详情处可以获取到 endpoint 和 namespace 的值
spring.cloud.nacos.config.endpoint=${endpoint}
spring.cloud.nacos.config.namespace=${namespace}
# 推荐使用 RAM 账户的 accessKey 和 secretKey
spring.cloud.nacos.config.access-key=${accessKey}
spring.cloud.nacos.config.secret-key=${secretKey}
# ACM 配置的 Data ID 等于 ${spring.application.name}.${spring.cloud.nacos.config.file-extension}
# 指定配置的 Data ID 前缀,例如:
spring.application.name=com.alibaba.nacos.example
# 指定配置的 Data ID 后缀,支持 properties、yaml、yml,默认为 properties
spring.cloud.nacos.config.file-extension=properties
# 指定 ACM 配置的 Group,默认为 DEFAULT_GROUP
spring.cloud.nacos.config.group=DEFAULT_GROUP
https://www.alibabacloud.com/help/zh/doc-detail/94708.htm?spm=a2c63.p38356.b99.56.547b66ae7aDsVW

# Nacos Spring Cloud 中,dataId 的完整格式如下:
${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}.${file-extension}
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
# @RefreshScope 实现配置自动更新
# 服务启动控制台日志显示默认加载nacos-config-client.properties文件
Loading nacos data, dataId: 'nacos-config-client.properties', group: 'DEFAULT_GROUP'
# spring-cloud-starter-alibaba-nacos-config 先加载bootstrap.yml文件
# Spring Boot中application.yml与bootstrap.yml的区别
Bootstrap.yml(bootstrap.properties)在application.yml(application.properties)之前加载,就像application.yml一样,但是用于应用程序上下文的引导阶段。它通常用于“使用Spring Cloud Config Server时,应在bootstrap.yml中指定spring.application.name和spring.cloud.config.server.git.uri”以及一些加密/解密信息。技术上,bootstrap.yml由父Spring ApplicationContext加载。父ApplicationContext被加载到使用application.yml的之前。

1.0.6 加载规则

Data ID中的nacos-config-client.properties :对应客户端的配置spring.cloud.nacos.config.prefix,默认值为${spring.application.name},即:服务名
Data ID中的properties:对应客户端的配置spring.cloud.nacos.config.file-extension,默认值为properties
Group的值DEFAULT_GROUP:对应客户端的配置spring.cloud.nacos.config.group,默认值为DEFAULT_GROUP
在采用默认值的应用要加载的配置规则就是:
Data ID=${spring.application.name}.properties,Group=DEFAULT_GROUP。
# 如果我们不想通过服务名来加载,那么可以增加如下配置,就会加载到Data ID=example.properties,Group=DEFAULT_GROUP的配置内容了:spring.cloud.nacos.config.prefix=example

# 如果我们想要加载yaml格式的内容,而不是Properties格式的内容,那么可以通过如下配置,实现加载Data ID=example.yaml,Group=DEFAULT_GROUP的配置内容了:
spring.cloud.nacos.config.prefix=example
spring.cloud.nacos.config.file-extension=yaml
# 如果我们对配置做了分组管理,那么可以通过如下配置,实现加载Data ID=example.yaml,Group=DEV_GROUP的配置内容了:
spring.cloud.nacos.config.prefix=example
spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.group=DEV_GROUP

1.0.6 多环境管理

Nacos中,本身有多个不同管理级别的概念,包括:Data ID、Group、Namespace。
1.	使用Data ID与profiles实现
	Data ID规则 ${spring.cloud.nacos.config.prefix}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}。而上面的结果是因为${spring.cloud.nacos.config.prefix}和${spring.cloud.nacos.config.file-extension}都使用了默认值。
	当配置spring.profiles.active=DEV时候会加载{spring.cloud.nacos.config.prefix}-DEV.properties
2.	Group实现
	a)	先在Nacos中,通过区分Group来创建两个不同环境的配置内容。如:DEV_GROUP和TEST_GROUP
	b)	spring.cloud.nacos.config.group=DEV_GROUP
	启动查看会默认加载DEV_GROUP的配置文件
3.	Namespace实现
	官方的概念说明:用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的Group或Data ID的配置。Namespace的常用场景之一是不同环境的配置的区分隔离,例如:开发测试环境和生产环境的资源(如配置、服务)隔离等。
	先在Nacos中的命名空间,根据环境名称来创建多个Namespace。
	在应用的配置文件中,增加Namespace的指定配置,比如:spring.cloud.nacos.config.namespace=83eed625-d166-4619-b923-93df2088883a 这里需要注意namespace的配置不是使用名称,而是使用Namespace的ID。
注意:不论用哪一种方式实现。对于指定环境的配置(spring.profiles.active=DEV、spring.cloud.nacos.config.group=DEV_GROUP、spring.cloud.nacos.config.namespace=83eed625-d166-4619-b923-93df2088883a),都不要配置在应用的bootstrap.properties中。而是在发布脚本的启动命令中,用-Dspring.profiles.active=DEV的方式来动态指定,会更加灵活!。
使用方法:
通过指定启动参数使用不同的profile,比如:
#   测试环境:java -jar spring-boot.jar --spring.profiles.active=test
#   生产环境:java -jar spring-boot.jar --spring.profiles.active=dev

1.0.7 多文件加载与共享配置

加载多个配置
	对所有应用的Actuator模块以及日志输出做统一的配置管理。所以,我们希望可以将Actuator模块的配置放在独立的配置文件actuator.properties文件中,而对于日志输出的配置放在独立的配置文件log.properties文件中。通过拆分这两类配置内容,希望可以做到配置的共享加载与统一管理。
1.	在Nacos中创建Data ID=actuator.properties,Group=DEFAULT_GROUP和Data ID=log.properties,Group=DEFAULT_GROUP的配置内容。
2.	在Spring Cloud应用中通过使用spring.cloud.nacos.config.ext-config参数来配置要加载的这两个配置内容, refresh自动刷新;
spring.cloud.nacos.config.ext-config[0].data-id=actuator.properties
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=log.properties
spring.cloud.nacos.config.ext-config[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[1].refresh=true

共享配置
通过上面加载多个配置的实现,实际上我们已经可以实现不同应用共享配置了。但是Nacos中还提供了另外一个便捷的配置方式,比如下面的设置与上面使用的配置内容是等价的:
spring.cloud.nacos.config.shared-dataids=actuator.properties,log.properties
spring.cloud.nacos.config.refreshable-dataids=actuator.properties,log.properties
# spring.cloud.nacos.config.shared-dataids参数用来配置多个共享配置的Data Id,多个的时候用用逗号分隔
# spring.cloud.nacos.config.refreshable-dataids参数用来定义哪些共享配置的Data Id在配置变化时,应用中可以动态刷新,多个Data Id之间用逗号隔开。如果没有明确配置,默认情况下所有共享配置都不支持动态刷新
配置加载的优先级
当加载多个配置的时候,如果存在相同的key时,需要深入了解配置加载的优先级关系。
在使用Nacos配置的时候,主要有以下三类配置:
A: 通过spring.cloud.nacos.config.shared-dataids定义的共享配置
B: 通过spring.cloud.nacos.config.ext-config[n]定义的加载配置
C: 通过内部规则(spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group这几个参数)拼接出来的配置
spring.cloud.nacos.config.ext-config[0].data-id=actuator.properties
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true

spring.cloud.nacos.config.shared-dataids=log.properties
spring.cloud.nacos.config.refreshable-dataids=log.properties
根据上面的配置,应用分别会去加载三类不同的配置文件,启动应用的时候,将会在日志中看到如下输出:
2019-04-25 15:28:06.665  INFO 63804 --- [main] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'log.properties', group: 'DEFAULT_GROUP'
2019-04-25 15:28:06.671  INFO 63804 --- [main] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'actuator.properties', group: 'DEFAULT_GROUP'
2019-04-25 15:28:06.677  INFO 63804 --- [main] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'alibaba-nacos-config-client.properties', group: 'DEFAULT_GROUP'
后面加载的配置会覆盖之前加载的配置,所以优先级关系是:A < B < C

1.0.8 数据持久化

在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
1.安装数据库,版本要求:5.6.5+
2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql

1.0.8 集群管理部署

参考数据持久化配置配置mysql
在Nacos的conf目录下有一个cluster.conf.example,可以直接把example扩展名去掉来使用,也可以单独创建一个cluster.conf文件,然后打开将后续要部署的Nacos实例地址配置在这里。
192.168.10.10:8848
192.168.10.11:8848
192.168.10.12:8848
Nacos的集群需要3个或3个以上的节点,并且确保这三个节点之间是可以互相访问的。
upstream cluster { 
      server 192.168.10.10:8848; 
      server 192.168.10.11:8848; 
	server 192.168.10.12:8848;
}
server {
    listen       80;                        		# 监听端口
    server_name www.healthy-chn.com healthy-chn.com;   	# 站点域名
    location /nacos/ {
       proxy_pass http://cluster;
    }
}
注:upstream 名称不支持下划线等特殊符号;

2.0 Feign

Feign:Feign是一种声明式、模板化的HTTP客户端。个人理解来说,Feign的功能类似dubbo暴露服务,但是与dubbo稍有不同的是Feign是HTTP REST接口的形式暴露的。

   2.0.1 服务提供者

	# 参见nacos 1.0.2服务提供者代码

 2.0.2 服务调用者

1. 创建Spring Boot应用(nacos-discovery-consumer-feign)

2. 加入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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.cloud.alibaba</groupId>
        <artifactId>alibaba-nacos</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.cloud.alibaba</groupId>
    <artifactId>nacos-discovery-consumer-feign</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-discovery-consumer-feign</name>
    <description>nacos 服务消费方 使用feign</description>

    <dependencies>
        <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>
        <!--Nacos的服务注册与发现模块-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
</project>

3. 配置服务名称和Nacos地址

spring:
  application:
    name: nacos-discovery-consumer-feign
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.43.142:8848
server:
  port: 9091

4. 创建应用主类加入@EnableDiscoveryClient注解

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

5. 定义Feign客户端 使用Feign客户端

@RestController
public class TestController {
    @Autowired
    TestService testService;
    @GetMapping("/test")
    public String test() {
        String result = testService.hello("zhangsan");
        return "Return : " + result;
    }
}

6. 使用Feign客户端

@FeignClient("nacos-discovery-provider")
public interface TestService {
    @GetMapping("/hello")
    String hello(@RequestParam(name = "name") String name);
}

7. 访问Nocas 服务列表

# 访问
http://localhost:9091/test

2.0.3 部分说明

@EnableFeignClients注解开启扫描Spring Cloud Feign客户端的功能;
@FeignClient注解来指定这个接口所要调用的服务名称;

3.0 Webflux

        Webflux模式替换了旧的Servlet线程模型。用少量的线程处理request和response io操作,这些线程称为Loop线程,而业务交给响应式编程框架处理,响应式编程是非常灵活的,用户可以将业务中阻塞的操作提交到响应式框架的work线程中执行,而不阻塞的操作依然可以在Loop线程中进行处理,大大提高了Loop线程的利用率。反应堆式编程reactor。

   3.0.1 服务提供者

	# 参见nacos 1.0.2服务提供者代码

 3.0.2 服务调用者

1. 创建Spring Boot应用(nacos-discovery-consumer- Webflux)

2. 加入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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.cloud.alibaba</groupId>
        <artifactId>alibaba-nacos</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.cloud.alibaba</groupId>
    <artifactId>nacos-discovery-consumer-webflux</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-discovery-consumer-webflux</name>
    <description>nacos 服务消费方 使用webflux</description>

    <dependencies>
        <!--注意这里没有spring-boot-starter-web依赖 而是webflux -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <!--Nacos的服务注册与发现模块-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project>

3. 配置服务名称和Nacos地址

spring:
  application:
    name: nacos-discovery-consumer-webflux
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.43.142:8848
server:
  port: 9092

4. 创建应用主类加入@@EnableDiscoveryClient注解

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

5. 实现一个HTTP接口

@RestController
public class TestController {
    @Autowired
    private WebClient.Builder webClientBuilder;

    @GetMapping("/test")
    public Mono<String> test() {
        Mono<String> result = webClientBuilder.build()
                .get()
                .uri("http://nacos-discovery-provider/hello?name=zhangsan")
                .retrieve()
                .bodyToMono(String.class);
        return result;
    }

    @Bean
    @LoadBalanced
    public WebClient.Builder loadBalancedWebClientBuilder() {
        return WebClient.builder();
    }
}

6. 访问Nocas 服务列表并测试

# 访问
http://localhost:9092/test

4.0 Gateway

          Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

   4.0.1 服务提供者

	# 参见nacos 1.0.2服务提供者代码

   4.0.2 服务调用者

1. 创建Spring Boot应用(nacos-discovery-consumer- Gateway)

2. 加入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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.cloud.alibaba</groupId>
        <artifactId>alibaba-nacos</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.cloud.alibaba</groupId>
    <artifactId>nacos-discovery-gateway-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-discovery-gateway-serverr</name>
    <description>nacos 整合 cloud gateway</description>

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

3. 配置服务名称和Nacos地址

spring:
  application:
    name: nacos-discovery-gateway-server
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.43.142:8848
        metadata:
          name: healthy
    gateway:
      routes:
        - id: nacos-discovery-provider
          uri: lb://nacos-discovery-provider
          predicates:
            - Path=/provider/**
          filters:
            - StripPrefix=1
server:
  port: 9093

4. 创建应用主类加入@EnableDiscoveryClient注解

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

5. 访问Nocas 服务列表并测试

# 访问
http://localhost:9093/provider/hello?name=zhansan 

   4.0.2 部分说明

LoadBalancerClientFilter在交换属性ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR中查找URI。 如果url具有lb方案(即lb:// myservice),它将使用Spring Cloud LoadBalancerClient将名称(前一示例中的myservice)解析为实际主机和端口,并替换相同属性中的URI。 未修改的原始URL将附加到ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR属性中的列表中。 过滤器还将查看ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR属性以查看它是否等于lb,然后应用相同的规则。https://cloud.spring.io/spring-cloud-gateway/spring-cloud-gateway.html#_loadbalancerclient_filter
StripPrefix GatewayFilter Factory采用一个参数,即部件。 parts参数指示在向下游发送之前从请求中剥离的路径中的部分数。https://cloud.spring.io/spring-cloud-gateway/spring-cloud-gateway.html#_stripprefix_gatewayfilter_factory
predicates: - Path=/provider/**
filters: - StripPrefix=1
Path 中的provider除了使用 StripPrefix配置之外还可以使用context.path来配置;推介使用StripPrefix方式配置;
server.servlet.context.path=provider

5.0 Sentinel

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

Sentinel 的主要特性:

 

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

部署Sentinel Dashboard

部署Sentinel Dashboard
下载地址:https://github.com/alibaba/Sentinel/releases
启动(默认端口:8080):
java -jar sentinel-dashboard-1.6.0.jar
java -jar -Dserver.port=8888 sentinel-dashboard-1.6.0.jar
默认用户名密码:sentinel

1. 创建Spring Boot应用(nacos-discovery-sentinel)

2. 加入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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.cloud.alibaba</groupId>
        <artifactId>alibaba-nacos</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.cloud.alibaba</groupId>
    <artifactId>nacos-discovery-sentinel</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-discovery-sentinel</name>
    <description>nacos 整合sentinel</description>

    <dependencies>
        <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>
        <!--Sentinel模块-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--Nacos存储扩展-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
    </dependencies>
</project>

3. 配置服务名称和Nacos地址

spring:
  application:
    name: nacos-discovery-sentinel
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8888
      datasource:
        ds:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}
            groupId: DEFAULT_GROUP
            ruleType: flow
server:
  port: 9095

4. 创建应用主类HTTP接口

@SpringBootApplication
public class NacosDiscoverySentinelApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosDiscoverySentinelApplication.class, args);
    }
}
@RestController
public class TestController {
    @GetMapping("/hello")
    public String hello() {
        return "xiaoming.zhang";
    }
}

5. 访问sentinel服务列表并限流测试

访问默认用户名密码为:sentinel
http://localhost:8888
点击“簇点链路”中的hello接口“流控”---配置单机阈值----新增;
刷新http://localhost:9095/hello接口测试;

通过nacos配置流控规则
打开nacos控制台----配置列表----新建配置

.

其中Data ID、Group就是上面配置文件中的内容;
JSON配置如下:
[
    {
        "resource": "/hello",
        "limitApp": "default",
        "grade": 1,
        "count": 5,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]

#
配置规则是一个数组类型,数组中的每个对象是针对每一个保护资源的配置对象,每个对象中的属性解释如下:
resource:资源名,即限流规则的作用对象
limitApp:流控针对的调用来源,若为 default 则不区分调用来源
grade:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
count:限流阈值
strategy:调用关系限流策略
controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
clusterMode:是否为集群模式

此时在Sentinel Dashboard---流控规则就可以看到上面nacos的配置已经同步;

6. 注意说明

spring.cloud.sentinel.transport.dashboard:sentinel dashboard的访问地址
spring.cloud.sentinel.datasource.ds.nacos.server-addr:nacos的访问地址
spring.cloud.sentinel.datasource.ds.nacos.groupId:nacos中存储规则的groupId
spring.cloud.sentinel.datasource.ds.nacos.dataId:nacos中存储规则的dataId
spring.cloud.sentinel.datasource.ds2.nacos.rule-type:flow
# 注意
Sentinel控制台中修改规则:仅存在于服务的内存中,不会修改Nacos中的配置值,重启后恢复原来的值。
Nacos控制台中修改规则:服务的内存中规则会更新,Nacos中持久化规则也会更新,重启后依然保持。


配套代码下载:https://download.csdn.net/download/qq_38765404/11775551

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章