1. 基本的な考え方
Spring Cloud は、分散マイクロサービス システムを構築するための「ファミリー バケット」として知られており、特定のテクノロジーではなく、一連のマイクロサービス ソリューションまたはフレームワークを順序立てて集めたものです。市場で成熟し実績のあるマイクロサービス フレームワークを統合し、Spring Boot のアイデアを通じてそれらを再パッケージ化し、複雑な構成と実装原則を保護および調整して、最終的に開発者にシンプルで理解しやすく簡単な一連のサービスを提供します。 -to-deploy および保守が容易な分散システム開発キット。
2. バージョン対応
Spring Boot + Spring Cloud をマイクロサービス開発に使用する場合、プロジェクト内の Spring Boot のバージョンに応じて Spring Cloud のバージョンを決定する必要があります。そうしないと、予期しないエラーが多く発生します。Spring Boot と Spring Cloud のバージョンの対応は次のとおりです。
Spring Cloud Alibaba バージョン | Springクラウドバージョン | スプリングブートバージョン |
---|---|---|
2022.0.0.0-RC* | 春の雲 2022.0.0 | 3.0.0 |
2021.0.4.0* |
春の雲 2021.0.4 |
2.6.11 |
2021.0.1.0 |
春の雲 2021.0.1 |
2.6.3 |
2021.1 |
春の雲 2020.0.1 |
2.4.2 |
2.2.9.リリース* |
スプリングクラウドホクストン.SR12 |
2.3.12.リリース |
2.2.8.リリース |
スプリングクラウドホクストン.SR12 |
2.3.12.リリース |
2.2.7.リリース |
スプリングクラウドホクストン.SR12 |
2.3.12.リリース |
2.2.6.リリース |
スプリング クラウド ホクストン.SR9 |
2.3.2.リリース |
2.1.4.リリース |
スプリング クラウド グリニッジ.SR6 |
2.1.13.リリース |
2.2.1.リリース |
スプリング クラウド ホクストン.SR3 |
2.2.5.リリース |
2.2.0.リリース |
Spring Cloud Hoxton.RELEASE |
2.2.X.リリース |
2.1.2.リリース |
スプリング クラウド グリニッジ |
2.1.X.リリース |
三、SpringCloud Netflix
<dependencyManagement>
<dependencies>
<!--在主工程中使用 dependencyManagement 声明 Spring Cloud 的版本,
这样工程内的 Module 中引入 Spring Cloud 组件依赖时,就不必在声明组件的版本信息
保证 Spring Cloud 各个组件一致性-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1. Eureka : Eureka は、Netflix によって開発されたオープンソースのサービス登録および検出コンポーネントです。
サービスレジストリ:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
server:
port: 8080 #该 Module 的端口号
eureka:
instance:
hostname: localhost #eureka服务端的实例名称,
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: #将自己注册到其他注册中心(集群)
メインのスタートアップ クラスで@EnableEurekaServerアノテーションを使用して、サービス レジストリ機能を有効にし、他のサービスの登録を受け入れます。
サービスプロバイダー/消費者:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
server:
port: 8081 #服务端口号
spring:
application:
name: microServiceCloudProviderDept #微服务名称,对外暴漏的微服务名称,十分重要
eureka:
client:
service-url:
defaultZone: ##将自己注册到其他注册中心(集群)
instance:
instance-id: spring-cloud-provider-8001 #自定义服务名称信息
prefer-ip-address: true #显示访问路径的 ip 地址
メインのスタートアップ クラスで、@EnableEurekaClientアノテーションを使用して Eureka クライアント機能を有効にし、サービスをサービス レジストリに登録します。
2. リボン: Netflix リボンは、Netflix によってリリースされたオープン ソース コンポーネントであり、その主な機能は、クライアント側の負荷分散アルゴリズムとサービス コールを提供することです。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
@Bean //将 RestTemplate 注入到容器中
@LoadBalanced //在客户端使用 RestTemplate 请求服务端时,开启负载均衡(Ribbon)
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean //切换负载均衡策略
public IRule iRule() {
return new RandomRule();
}
3. OpenFeign : OpenFeign の正式名は Spring Cloud OpenFeign で、Spring によって正式に開始された宣言型サービス呼び出しおよび負荷分散コンポーネントであり、Ribbon はリモート呼び出し用の RestTemplete を置き換えるために内部的に統合されています。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
//服务提供者提供的服务名称,即 application.name
@FeignClient(value = "")
public interface UserService {
//接口内部的定义与被调用服务的接口一致
}
@EnableFeignClientsアノテーションを メインの起動クラスに 追加して、OpenFeign 機能を有効にします。
4. Hystrix : Spring Cloud Hystrix は、Netflix のオープンソースコンポーネント Hystrix に基づいて実装されており、分散マイクロサービス システムにおけるリンク障害を効果的に防止し、マイクロサービス システムの弾力性を向上させることができるヒューズ機能を提供します。Spring Cloud Hystrix には、サービスの低下、サービスの融合、スレッドの分離、リクエストのキャッシュ、リクエストのマージ、リアルタイムの障害監視などの強力な機能があります。
サービスのダウングレード:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
//一旦该方法失败并抛出了异常信息后,会自动调用fallbackMethod指定的方法
//规定 5 秒钟以内就不报错,正常运行,超过 5 秒就报错,调用指定的方法
@HystrixCommand(fallbackMethod = "exceptionHandler",
commandProperties =
{@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value = "5000")})
@EnableCircuitBreakerアノテーションを メインの起動クラスに 追加して 、機能を有効にします。
クライアント サービスをダウングレードする必要がある場合は、 @EnableHystrixアノテーションを メインの起動クラスに 追加し、以下を構成する必要があります。
feign:
hystrix:
enabled: true #开启客户端 hystrix
サービスヒューズ:
@HystrixCommand(fallbackMethod = "deptCircuitBreaker_fallback", commandProperties = {
//以下参数在 HystrixCommandProperties 类中有默认配置
@HystrixProperty(name = "circuitBreaker.enabled", value = "true"), //是否开启熔断器
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value = "1000"), //统计时间窗
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //统计时间窗内请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //休眠时间窗口期
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), //在统计时间窗口期以内,请求失败率达到 60% 时进入熔断状态
})
パラメータ | 説明 |
---|---|
metrics.rollingStats.timeInミリ秒 | 統計的な時間枠。 |
サーキットブレーカー.スリープウィンドウミリ秒 | スリープ タイム ウィンドウ。ヒューズが一定期間オンになった後、ヒューズは自動的に半溶断状態に入ります。この期間はスリープ ウィンドウ期間と呼ばれます。 |
circuitBreaker.requestVolumeThreshold | リクエストの合計しきい値。 統計的な時間枠内で、Hystrix がヒューズを開いてヒューズ オン状態に入る前に、リクエストの総数が一定の桁に達する必要があります。このリクエストの桁数がリクエストの総数のしきい値となります。Hystrix リクエストの合計数のデフォルトのしきい値は 20 です。これは、統計時間ウィンドウ内で、サービス コールの数が 20 回未満の場合、すべてのリクエストがエラーを呼び出したとしても、ヒューズは開かれないことを意味します。 |
CircuitBreaker.errorThresholdPercentage | エラーの割合のしきい値。 リクエストの総数が統計時間ウィンドウ内のリクエストの総数のしきい値を超え、リクエスト呼び出しエラー率が特定の比率を超えると、ヒューズが開いてヒューズオン遷移状態に入ります。この比率はエラー率のしきい値。エラー パーセンテージのしきい値が 50 に設定されている場合、エラー パーセンテージが 50% であることを意味します。サービスに 30 件の呼び出しがあり、そのうち 15 件でエラーが発生した場合、つまりエラー パーセンテージが 50% を超えた場合、ヒューズは次の時点で開きます。この時。 |
5. ゲートウェイ: Spring Cloud Gateway は、Spring 5.0、Spring Boot 2.0、Project Reactor などのテクノロジーに基づいて Spring Cloud チームによって開発された高性能 API ゲートウェイ コンポーネントです。
ゲートウェイ サービスは、spring-web の依存関係をインポートできません。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
spring:
cloud:
gateway: #网关路由配置,将服务器提供的服务隐藏起来,不暴露给客户端,只给客户端暴露 API 网关的地址
routes:
#可配置多个路由
- id: #路由id,没有固定规则,但唯一,建议与服务名对应
uri:lb://service-name #路由匹配后提供服务的服务名
predicates:
#以下是断言条件,必选全部符合条件
- Path= #断言,路径匹配 注意:Path 中 P 为大写
- Method=GET #只能时 GET 请求时,才能访问
filters:
- AddRequestParameter=X-Request-Id,1024 #过滤器工厂会在匹配的请求头加上一对请求头,名称为 X-Request-Id 值为 1024
- PrefixPath=/prefix #在请求路径前面加上 /prefix
一般的な主張:
断言 | 例 | 説明する |
---|---|---|
道 | - パス=/dept/list/** | リクエストのパスが /dept/list/** と一致する場合、リクエストは http://localhost:8001 に転送できます。 |
前 | - 前=2021-10-20T11:47:34.255+08:00[アジア/上海] | 2021 年 10 月 20 日 11:47:34.255 より前に行われたリクエストは、http://localhost:8001 に転送されます。 |
後 | - 後=2021-10-20T11:47:34.255+08:00[アジア/上海] | 2021 年 10 月 20 日 11:47:34.255 以降に行われたリクエストは、http://localhost:8001 に転送されます。 |
間 | - 間=2021-10-20T15:18:33.226+08:00[アジア/上海]、2021-10-20T15:23:33.226+08:00[アジア/上海] | 2021 年 10 月 20 日の 15:18:33.226 から 2021 年 10 月 20 日の 15:23:33.226 までのリクエストは、http://localhost:8001 サーバーに転送されます。 |
クッキー | -Cookie=名前,c.biancheng.net | Cookie を含み、Cookie の内容が name=c.biancheng.net であるリクエストのみが http://localhost:8001 に転送されます。 |
ヘッダ | - ヘッダー=X-リクエストID,\d+ | リクエスト ヘッダーに属性 X-Request-Id があり、属性値が整数であるリクエストのみが http://localhost:8001 に転送されます。 |
方法 | - メソッド=GET | GET リクエストのみが http://localhost:8001 に転送されます。 |
一般的に使用されるフィルター:
ルートフィルター | 説明 | パラメータ | 使用例 |
---|---|---|---|
リクエストヘッダーの追加 | 受信リクエストをインターセプトし、指定されたリクエスト ヘッダー パラメータをリクエストに追加します。 | name: 追加するリクエストヘッダーパラメータのキー; value: 追加するリクエストヘッダーパラメータの値。 |
- AddRequestHeader=私のリクエストヘッダー,1024 |
AddRequestパラメータ | 受信リクエストをインターセプトし、指定されたリクエスト パラメータをリクエストに追加します。 | name: 追加するリクエストパラメータのキー; value: 追加するリクエストパラメータの値。 |
- AddRequestParameter=my-request-param,c.biancheng.net |
応答ヘッダーの追加 | 応答をインターセプトし、指定された応答ヘッダー パラメーターを応答に追加します。 | name: 追加する応答ヘッダーのキー; value: 追加する応答ヘッダーの値。 |
- AddResponseHeader=my-response-header,c.biancheng.net |
PrefixPath | 拦截传入的请求,并在请求路径增加一个指定的前缀。 | prefix:需要增加的路径前缀。 | - PrefixPath=/consumer |
PreserveHostHeader | 转发请求时,保持客户端的 Host 信息不变,然后将它传递到提供具体服务的微服务中。 | 无 | - PreserveHostHeader |
RemoveRequestHeader | 移除请求头中指定的参数。 | name:需要移除的请求头的 key。 | - RemoveRequestHeader=my-request-header |
RemoveResponseHeader | 移除响应头中指定的参数。 | name:需要移除的响应头。 | - RemoveResponseHeader=my-response-header |
RemoveRequestParameter | 移除指定的请求参数。 | name:需要移除的请求参数。 | - RemoveRequestParameter=my-request-param |
RequestSize | 配置请求体的大小,当请求体过大时,将会返回 413 Payload Too Large。 | maxSize:请求体的大小。 | - name: RequestSize args: maxSize: 5000000 |
全局过滤器:
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return null;
}
@Override
public int getOrder() {
//过滤器的顺序,0 表示第一个
return 0;
}
}
四、SpringCloud Alibaba
<dependencyManagement>
<dependencies>
<!--Spring Cloud Alibaba 的版本信息-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</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>
</dependencies>
</dependencyManagement>
1.Nacos:Nacos 服务注册中心和配置中心的组合体,它可以替换 Eureka 作为服务注册中心,实现服务的注册与发现;还可以替换 SpringCloud Config 作为配置中心,实现配置的动态刷新。先在官网下载 Nacos Server 并运行。
注册中心:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
spring:
cloud:
nacos:
discovery:
cluster-name: BJ #设置集群
namespace: public #命名空间
ephemeral: false #设置非临时实例
server-addr: localhost:8848 #注册中心地址
在主启动类上,使用 @EnableDiscoveryClient 注解开启 Nacos 服务发现功能。
配置中心:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
在 /resources 目录下,添加一个 bootstrap.yml文件:
#启动时获取远程配置
spring:
application:
name: book #应用名称
profiles:
active: public #应用环境
cloud:
nacos:
config:
file-extension: yaml #文件名后缀
server-addr: localhost:8848 #配置中心地址
group: #配置分组
在 Nacos 控制台新建配置文件,并进行配置,文件名:
${application.name}-${spring.profiles.active}.${file-extension}
在 Controller 类上使用 @RefreshScope 注解实现配置的自动更新。
集群:在 mysql 执行 conf 中的 mysql-schema.sql 文件,并在 application.properties 文件中添加数据库信息。
2.Sentinel:Sentinel 是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控制组件。先在官网下载 jar 包并运行。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
spring:
cloud:
sentinel:
transport:
#配置 Sentinel dashboard 地址
dashboard: localhost:8080
#默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
port: 8719
限流:可以通过 Sentinel 控制台,直接对资源定义流控规则。
属性 | 说明 | 默认值 |
---|---|---|
资源名 | 流控规则的作用对象。 | - |
阈值 | 流控的阈值。 | - |
阈值类型 | 流控阈值的类型,包括 QPS 或并发线程数。 | QPS |
针对来源 | 流控针对的调用来源。 | default,表示不区分调用来源 |
流控模式 | 调用关系限流策略,包括直接、链路和关联。 | 直接 |
流控效果 | 流控效果(直接拒绝、预热、匀速排队),不支持按调用关系限流。 | 直接拒绝 |
在服务代码中使用 @SentinelResource 注解定义资源名称,并在 blockHandler 属性指定一个限流函数或 blockHandlerClass 限流类,自定义服务限流信息。使用 @SentinelResource 注解的 blockHandler 属性时,需要注意以下事项:
- blockHandler 函数访问范围需要是 public;
- 返回类型需要与原方法相匹配;
- 参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException;
- blockHandler 函数默认需要和原方法在同一个类中,若希望使用其他类的函数,则可以指定 blockHandler 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
熔断降级: 可以通过 Sentinel 控制台直接对资源定义熔断降级规则。
熔断策略 | 说明 |
---|---|
慢调用比例 (SLOW_REQUEST_RATIO) |
选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大响应时间),若请求的响应时间大于该值则统计为慢调用。 当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。 经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则再次被熔断。 |
异常比例 (ERROR_RATIO) | 当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目且异常的比例大于阈值,则在接下来的熔断时长内请求会自动被熔断。 经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。 |
异常数 (ERROR_COUNT) | 当单位统计时长内的异常数目超过阈值之后会自动进行熔断。 经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。 |
规则持久化:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
spring:
cloud:
sentinel:
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: #微服务名称
groupId: #分组名称
data-type: json
rule-type: flow #流控规则
在 nacos 控制台添加配置:
[
{
"resource":"/persistent",//资源名称
"limitApp":"default",//来源应用
"grade":1,//阈值类型,0线程数,1QPS
"count":1,//单机阈值
"strategy":0,//流控模式,0表示直接,1表示关联,2表示链路
"controlBehavior":0,//流控效果 ,0表示快速失败,1表示warm up,2表示排队等待
"clusterMode":false //是否集群
}
]
3.Seata:Seata 是一个分布式事务处理框架,它是由阿里巴巴和蚂蚁金服共同开源的分布式事务解决方案,能够在微服务架构下提供高性能且简单易用的分布式事务服务。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
在事务方法上添加 @GlobalTransactional