SpringCloud微服務(wù)(05):Zuul組件,實(shí)現(xiàn)路由網(wǎng)關(guān)控制-創(chuàng)新互聯(lián)

本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、義縣網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、義縣網(wǎng)絡(luò)營銷、義縣企業(yè)策劃、義縣品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供義縣建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:muchs.cn

一、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)

SpringCloud微服務(wù)(05):Zuul組件,實(shí)現(xiàn)路由網(wǎng)關(guān)控制

啟動順序如下:

# 注冊中心
node05-eureka-7001
# 兩個服務(wù)提供者
node05-provider-6001
node05-provider-6002
# 網(wǎng)關(guān)控制
node05-zuul-7002

啟動成功后,注冊中心展示如下:
SpringCloud微服務(wù)(05):Zuul組件,實(shí)現(xiàn)路由網(wǎng)關(guān)控制

二、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: true
  client:
    service-url:
      defaultZone: http://registry01.com:7001/eureka/
zuul:
  # 前綴,可以用來做版本控制
  prefix: /v1
  # 禁用默認(rèn)路由,執(zhí)行配置的路由
  ignored-services: "*"
  routes:
    # 配置6001接口微服務(wù)
    pro6001:
      serviceId: node05-provider-6001
      path: /api-6001/**
    # 配置6002接口微服務(wù)
    pro6002:
      serviceId: node05-provider-6002
      path: /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) ;
    @Override
    public 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() {
            @Override
            public HttpStatus getStatusCode() {
                return status;
            }
            @Override
            public int getRawStatusCode() {
                return status.value();
            }
            @Override
            public String getStatusText() {
                return status.getReasonPhrase();
            }
            @Override
            public void close() {
                LOGGER.info("close");
            }
            @Override
            public InputStream getBody() {
                String message =
                        "{\n" +
                            "\"code\": 200,\n" +
                            "\"message\": \"微服務(wù)飛出了地球\"\n" +
                        "}";
                return new ByteArrayInputStream(message.getBytes());
            }
            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
    @Override
    public String getRoute() {
        return "*";
    }
    @Override
    public 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) ;
    @Override
    public String filterType() {
        return "pre";
    }
    @Override
    public int filterOrder() {
        return 0;
    }
    @Override
    public boolean shouldFilter() {
        return true;
    }
    @Override
    public 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/2

2)測試服務(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/spring-cloud-base
GitEE·地址
https://gitee.com/cicadasmile/spring-cloud-base

SpringCloud微服務(wù)(05):Zuul組件,實(shí)現(xiàn)路由網(wǎng)關(guān)控制

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

本文名稱:SpringCloud微服務(wù)(05):Zuul組件,實(shí)現(xiàn)路由網(wǎng)關(guān)控制-創(chuàng)新互聯(lián)
分享URL:http://muchs.cn/article4/dejcoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、云服務(wù)器做網(wǎng)站、網(wǎng)站收錄外貿(mào)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)