SpringCloud_v2.0

1another1發表於2020-12-12

SpringCloud_v2.0

在這裡插入圖片描述

Gateway閘道器

簡介:spring官方推出替代Netflix Zuul的閘道器框架,核心是過濾和路由。通過一系列過濾器將客戶端請求轉發(路由)到對應的微服務。它也是整個微服務的防火牆和代理器,可以隱藏服務節點的ip埠資訊。除此之外,它本身也是一個微服務,要註冊到Eureka服務中心。

入門

# 通過閘道器將包含/user的請求路由到http://127.0.0.1:9091/user/id
# 配置資訊(引入依賴eureka-client和gateway)
server:
  port: 10010
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        # 路由id可以任意
        - id: user-service-route
          # (地址寫死)uri: http://127.0.0.1:9091
          uri: lb://user-service # 配置動態路由(lb之後的服務名必須要在eureka中註冊)
          # 路由斷言:可以匹配對映路徑
          predicates:
            - Path=/user/**
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true

路由字首處理

# 新增字首:http://127.0.0.1:10010/8  -> http://127.0.0.1:10010/user/8

predicates:
	- Path=/**
filters:
    # 新增請求路徑的字首
    - PrefixPath=/user

# 去除字首:http://127.0.0.1:10010/api/user/8 -> http://127.0.0.1:10010/user/8
predicates:    
	- Path=/api/user/**
filters:
  # 過濾一個路徑
  - StripPrefix=1 #2的話就是兩個

自定義全域性過濾器

//區域性過濾器就先過了

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("全域性過濾器");
        ServerHttpRequest request = exchange.getRequest();
        String token = request.getQueryParams().getFirst("token");
        if(StringUtils.isBlank(token)){
            //設定響應狀態碼為未授權
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        //值越小越先執行(配置優先順序)
        return 0;
    }

}

/*
1.通過postman去測試介面http://127.0.0.1:10010/user/8?token=abc 可以拿到status:200 OK
2.如果測試的是 http://127.0.0.1:10010/user/8?name=lxw  就會拿到status:401 UNAUTHORIZED
*/

Gateway跨域配置

一般而言閘道器是所有微服務的統一入口,在呼叫時候會出現跨域問題。(前端js請求訪問地址與當前伺服器的域名、ip或埠號不一致就是跨域請求。)

spring:
  cloud:
    gateway:
      # 解決跨域問題
      globalcors:
          corsConfigurations:
            '[/**]':
            # allowedOrigins: * (*表示全部)
              allowedOrigins:
                - "http://docs.spring.io"
              allowedMethods:
                - GET

Gateway閘道器一般是給終端請求使用的,而Feign是在微服務之間呼叫。


SpringCloud Config

簡介:可以修改在git倉庫中的配置檔案完成其它所有微服務的配置檔案的修改。

在這裡插入圖片描述

搭建配置中心

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!--啟動類裡面加入註釋開啟配置服務
    @SpringBootApplication
    @EnableConfigServer
    @EnableDiscoveryClient
-->
server:
  port: 12000

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/lanotherl/lxw-config.git # 配置檔案所在的倉庫名 如果是私有的就加上gitee的賬號密碼
          username: ?????
          password: ?????

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
      # 本身也是個服務 要註冊到服務中心

讀取配置中心裡的配置檔案

拿一個微服務專案來說,現在可以將原來專案中的application.yml刪除,新增一個bootstrap.yml配置檔案

在裡面寫一些專案中固定的配置項,變動的都放在配置中心統一管理

spring:
  cloud:
    config:
      # 要與倉庫中的配置檔案的application保持一致
      name: user
      # 要與倉庫中的配置檔案的profile保持一致
      profile: dev
      # 要與倉庫中的配置檔案所屬的版本(分支)一樣
      label: master
      discovery:
        # 使用配置中心
        enabled: true
        # 配置中心服務名
        service-id: config-server
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

SpringCloud Bus

當git倉庫的配置檔案更新時,在不重啟系統的情況下實現及時同步到各個微服務。

在這裡插入圖片描述

# config-server的配置檔案中(配置中心)
management:
  endpoints:
    web:
      exposure:
        # 暴露觸發訊息匯流排的地址
        include: bus-refresh
        
# 配置中心和具體微服務都要配置rabbitmq資訊
rabbitmq:
  host: localhost
  port: 5672
  username: guest
  password: guest
  
  
# 在對應控制器controller上還要加上註釋@RefreshScope來重新整理配置

接著改動git上面的配置檔案資訊(注意!一定要通過向http://127.0.0.1:12000/actuator/bus-refresh地址傳送post請求才能更新配置資訊到rabbitmq中,再由rabbitmq發放到各個微服務中 完成配置資訊的更新)


SpringCloud 大雜燴綜合應用

在這裡插入圖片描述

總結

  1. 首先,我們開發微服務—比如使用者服務、訂單服務,並對其做叢集部署。
  2. 將服務都註冊到Eureka服務註冊中心
  3. 服務之間通過Feign相互呼叫
  4. 各個微服務的配置從SpringCloud Config配置中心獲取(配置中心讀取Git倉庫)
  5. 如果Git倉庫的配置檔案更新了,又不想要重啟服務。就通過SpringCloud Bus、RabbitMQ(用post請求去重新整理)更新服務的配置。
  6. PC或者移動端的請求先經過Gateway閘道器,進行許可權鑑定、異常、日誌記錄,再將請求路由到不同的微服務。由於微服務部署了叢集,因此路由過程中會通過Ribbon進行負載均衡,從中選擇一個地址去呼叫。如果服務出現了錯誤異常,基於Hystrix進行服務降級。