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