SpringCloud常用組件


Spring Cloud Alibaba

Spring Cloud Alibaba 致力於提供微服務開發的一站式解決方案。此項目包含開發分布式應用微服務的必需組件,方便開發者通過 Spring Cloud 編程模型輕松使用這些組件來開發分布式應用服務。

引入依賴,在 dependencyManagement 中添加如下配置。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.6.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Nacos 服務注冊與發現

Nacos 是阿里巴巴開源的一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平台。

首先需要獲取 Nacos Server,Nacos Server 下載頁

修改 pom.xml 文件,引入 Nacos Discovery Starter。

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

在配置文件中配置 Nacos Server 地址

server:
  port: 8082

spring:
  application:
    name: service-provider
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848

使用 @EnableDiscoveryClient 注解開啟服務注冊與發現功能

 @SpringBootApplication
 @EnableDiscoveryClient
 public class ProviderApplication {

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

Nacos 分布式配置管理

首先,修改 pom.xml 文件,引入 Nacos Config Starter。

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

在應用的 /src/main/resources/bootstrap.yml 配置文件中配置 Nacos Config 元數據

spring:
  application:
    name: service-provider

  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: d1c63875-be0c-46db-81d5-bd037567f9c1
        file-extension: yaml

完成上述兩步后,應用會從 Nacos Config 中獲取相應的配置,並添加在 Spring Environment 的 PropertySources 中。這里我們使用 @Value 注解來將對應的配置注入到 SampleController 的 userName 和 age 字段,並添加 @RefreshScope 打開動態刷新功能

 @RefreshScope
 class SampleController {

 	@Value("${user.name}")
 	String userName;

 	@Value("${user.age}")
 	int age;
 }

在Nacos控制台的配置列表中添加配置,Data ID: service-provider.yaml,Group: DEFAULT_GROUP,內容如下

user:
  name: orange
  age: 23

OpenFeign 服務調用

OpenFeign 是Spring Cloud 的組件,所以要加入spring cloud 的依賴管理

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.6.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR12</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Nacos Discovery Starter 默認集成了 Ribbon ,所以對於使用了 Ribbon 做負載均衡的組件,可以直接使用 Nacos 的服務發現。

首先,修改 pom.xml 文件,引入 OpenFeign Starter。

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

使用注解 @EnableFeignClients 開啟服務調用

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {

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

}

FeignClient 已經默認集成了 Ribbon ,此處演示如何配置一個 FeignClient。

 @FeignClient(name = "service-provider")
 public interface EchoService {
     @GetMapping(value = "/echo/{str}")
     String echo(@PathVariable("str") String str);
 }

Gateway 網關

簡單使用

修改 pom.xml 文件,引入 Sentinel Starter

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

網關配置

server:
  port: 8080

spring:
  application:
    name: service-gateway

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

    gateway:
      routes:
        - id: service-provider
          uri: lb://service-provider
          predicates:
            - Path=/provider/**
        - id: service-consumer
          uri: lb://service-consumer
          predicates:
            - Path=/consumer/**

Sentinel 流量控制、熔斷降級

隨着微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。

如何在Spring Cloud Alibaba中使用Sentinel

  1. 首先下載 Sentinel 控制台 jar 包:https://github.com/alibaba/Sentinel/releases
    啟動Sentinel控制台
java -jar sentinel-dashboard-1.8.1.jar --server.port=9090

訪問localhost:9090,默認用戶名密碼都是sentinel

  1. 修改 pom.xml 文件,引入 Sentinel Starter
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 配置 Sentinel 控制台地址信息
    application.yml
spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:9090

這里的 spring.cloud.sentinel.transport.port 端口配置會在應用對應的機器上啟動一個 Http Server,該 Server 會與 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一個限流規則,會把規則數據 push 給這個 Http Server 接收,Http Server 再將規則注冊到 Sentinel 中。

sentinel 流量控制

給請求上流控規則
比如現在有個資源路徑 GET:http://service-provider/provider/hello/{name},設置每秒只接收一個請求

訪問這個加上流控規則的路徑時,每秒大於一個請求就會返回失敗信息

這個時sentinel默認的返回信息,可以自定返回信息

@Configuration
public class SentinelConfig {

    @Bean
    public BlockExceptionHandler blockExceptionHandler() {
        return new BlockExceptionHandler() {
            @Override
            public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
                httpServletResponse.setContentType("application/json;charset=utf-8");
                ResponseData responseData = new ResponseData(5001, "活動火爆,請稍后再試");
                String s = new ObjectMapper().writeValueAsString(responseData);
                httpServletResponse.getWriter().write(s);
            }
        };
    }

}

Sentinel 支持 Endpoint

在使用 Endpoint 特性之前需要在 Maven 中添加 spring-boot-starter-actuator 依賴,並在配置中允許 Endpoints 的訪問。

Spring Boot 1.x 中添加配置 management.security.enabled=false。暴露的 endpoint 路徑為 /sentinel

Spring Boot 2.x 中添加配置 management.endpoints.web.exposure.include=*。暴露的 endpoint 路徑為 /actuator/sentinel

Sentinel Endpoint 里暴露的信息非常有用。包括當前應用的所有規則信息、日志目錄、當前實例的 IP,Sentinel Dashboard 地址,Block Page,應用與 Sentinel Dashboard 的心跳頻率等等信息。

Sentinel支持Feign服務熔斷

Sentinel 適配了 Feign 組件。如果想使用,除了引入 spring-cloud-starter-alibaba-sentinel,只需要在配置文件打開 Sentinel 對 Feign 的支持

feign:
  sentinel:
    enabled: true
@FeignClient(value = "service-provider",fallback = ProviderOuterServiceFallback.class)
public interface ProviderOuterService {

    @GetMapping("provider/hello/{name}")
    String hello(@PathVariable String name);
}
@Component
public class ProviderOuterServiceFallback implements ProviderOuterService {
    @Override
    public String hello(String name) {
        return "系統錯誤";
    }
}

Sentinel-Gateway網關限流

從 1.6.0 版本開始,Sentinel 提供了 Spring Cloud Gateway 的適配模塊,可以提供兩種資源維度的限流:

  • route 維度:即在 Spring 配置文件中配置的路由條目,資源名為對應的 routeId
  • 自定義 API 維度:用戶可以利用 Sentinel 提供的 API 來自定義一些 API 分組

使用時在網關服務添加sentinel適配gateway的依賴

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

來個使用案例,所有的請求都會經過網關服務,限制每個IP每秒最多能請求三次;
API管理 > 新增API分組

匹配串/** 表示所有的請求

流控規則 > 新增網關流控規則

當單個相同的IP每秒請求次數超過3次就會返回失敗信息

這個是Sentinel默認的返回信息,可以自定義

@Configuration
public class SentinelGatewayConfig {

    @Bean
    public BlockRequestHandler blockRequestHandler() {
        return new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                ResponseData responseData = new ResponseData(4001, "請稍后再試");
                String res = null;
                try {
                    res = new ObjectMapper().writeValueAsString(responseData);
                } catch (JsonProcessingException e) {
                    e.printStackTrace();
                }
                Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(res), String.class);
                return body;
            }
        };
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM