當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SpringCloud微服务(05):Zuul组件,实现路由网关控制
生活随笔
收集整理的這篇文章主要介紹了
SpringCloud微服务(05):Zuul组件,实现路由网关控制
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、Zuul組件簡介
1、基礎(chǔ)概念
Zuul 網(wǎng)關(guān)主要提供動態(tài)路由,監(jiān)控,彈性,安全管控等功能。在分布式的微服務(wù)系統(tǒng)中,系統(tǒng)被拆為了多個微服務(wù)模塊,通過zuul網(wǎng)關(guān)對用戶的請求進(jìn)行路由,轉(zhuǎn)發(fā)到具體的后微服務(wù)模塊中。
2、Zuul的作用
1)按照不同策略,將請求轉(zhuǎn)發(fā)到不同的服務(wù)上去;
2)聚合API接口,統(tǒng)一對外暴露,提高系統(tǒng)的安全性;
3)實(shí)現(xiàn)請求統(tǒng)一的過濾,以及服務(wù)的熔斷降級;
3、案例結(jié)構(gòu)
啟動順序如下:
# 注冊中心 node05-eureka-7001 # 兩個服務(wù)提供者 node05-provider-6001 node05-provider-6002 # 網(wǎng)關(guān)控制 node05-zuul-7002啟動成功后,注冊中心展示如下:
二、Zuul使用詳解
1、核心依賴
<!-- 路由網(wǎng)關(guān) --> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId> </dependency>2、核心配置文件
server:port: 7002 spring:application:name: cloud-node05-parent eureka:instance:prefer-ip-address: trueclient:service-url:defaultZone: http://registry01.com:7001/eureka/ zuul:# 前綴,可以用來做版本控制prefix: /v1# 禁用默認(rèn)路由,執(zhí)行配置的路由ignored-services: "*"routes:# 配置6001接口微服務(wù)pro6001:serviceId: node05-provider-6001path: /api-6001/**# 配置6002接口微服務(wù)pro6002:serviceId: node05-provider-6002path: /api-6002/**- 啟動類注解:@EnableZuulProxy
3、統(tǒng)一服務(wù)降級
實(shí)現(xiàn)FallbackProvider接口,自定義響應(yīng)提示。
@Component public class FallBackConfig implements FallbackProvider {private static final Logger LOGGER = LoggerFactory.getLogger(FallBackConfig.class) ;@Overridepublic ClientHttpResponse fallbackResponse(Throwable cause) {// 捕獲超時異常,返回自定義信息if (cause instanceof HystrixTimeoutException) {return response(HttpStatus.GATEWAY_TIMEOUT);} else {return fallbackResponse();}}private ClientHttpResponse response(final HttpStatus status) {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() {return status;}@Overridepublic int getRawStatusCode() {return status.value();}@Overridepublic String getStatusText() {return status.getReasonPhrase();}@Overridepublic void close() {LOGGER.info("close");}@Overridepublic InputStream getBody() {String message ="{\n" +"\"code\": 200,\n" +"\"message\": \"微服務(wù)飛出了地球\"\n" +"}";return new ByteArrayInputStream(message.getBytes());}@Overridepublic HttpHeaders getHeaders() {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);return headers;}};}@Overridepublic String getRoute() {return "*";}@Overridepublic ClientHttpResponse fallbackResponse() {return response(HttpStatus.INTERNAL_SERVER_ERROR);} }4、統(tǒng)一過濾器
繼承ZuulFilter類,自定義過濾動作。
@Component public class FilterConfig extends ZuulFilter {private static final Logger LOGGER = LoggerFactory.getLogger(FilterConfig.class) ;@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {RequestContext requestContext = RequestContext.getCurrentContext() ;try {doBizProcess(requestContext);} catch (Exception e){LOGGER.info("異常:{}",e.getMessage());}return null;}public void doBizProcess (RequestContext requestContext) throws Exception {HttpServletRequest request = requestContext.getRequest() ;String reqUri = request.getRequestURI() ;if (!reqUri.contains("getAuthorInfo")){requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(401);requestContext.getResponse().getWriter().print("Path Is Error...");}} }5、測試流程
1)測試網(wǎng)關(guān)配置
訪問如下接口,響應(yīng)正常,說明網(wǎng)關(guān)配置生效:
http://localhost:7002/v1/api-6001/getAuthorInfo/1 http://localhost:7002/v1/api-6002/getAuthorInfo/22)測試服務(wù)降級
關(guān)閉6001服務(wù),再次訪問接口,提示信息如下,說明服務(wù)降級策略生效:
{"code": 200,"message": "微服務(wù)飛出了地球" }3)測試過濾器
因?yàn)檎埱骍RI不匹配getAuthorInfo,所以被攔截,說明過濾器略生效:
http://localhost:7002/v1/api-6001/ 響應(yīng)提示: Path Is Error...三、源代碼地址
GitHub地址:知了一笑 https://github.com/cicadasmile 碼云地址:知了一笑 https://gitee.com/cicadasmile總結(jié)
以上是生活随笔為你收集整理的SpringCloud微服务(05):Zuul组件,实现路由网关控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU-2062 Subset sequ
- 下一篇: 数据结构 单链表 (C++)(转载)