欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

SpringCloud中如何使用Zuul路由網(wǎng)關(guān)

SpringCloud中如何使用Zuul路由網(wǎng)關(guān),相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出翁源免費(fèi)做網(wǎng)站回饋大家。

一、Zuul的作用

1. 網(wǎng)關(guān)功能

  • 網(wǎng)關(guān)可以將所有的api統(tǒng)一暴露,保護(hù)其他服務(wù)api接口和信息,以防止被外界直接調(diào)用

  • 網(wǎng)關(guān)可以做身份認(rèn)證和權(quán)限認(rèn)證,防止非法請(qǐng)求操作API,保護(hù)服務(wù)

  • 網(wǎng)關(guān)可以實(shí)現(xiàn)監(jiān)控功能,實(shí)時(shí)日志輸出,對(duì)請(qǐng)求進(jìn)行記錄

  • 網(wǎng)關(guān)可以實(shí)現(xiàn)流量監(jiān)控,便于在高流量情況下對(duì)服務(wù)進(jìn)行降級(jí)

2. 智能路由

  • Zuul可以和Ribbon、Eureka相結(jié)合,實(shí)現(xiàn)智能路由和負(fù)載均衡

  • 通過一定策略,把請(qǐng)求流量分發(fā)到集群狀態(tài)的多個(gè)實(shí)例中

  • 可以將API從內(nèi)部接口中分離出來,方便單測(cè)

二、Zuul的工作原理

Zuul基于Servlet實(shí)現(xiàn),通過自定義的ZuulServlet來對(duì)請(qǐng)求進(jìn)行控制,Zuul中有一系列的過濾器,這些過濾器是同樣是Zuul的實(shí)現(xiàn)關(guān)鍵,請(qǐng)求發(fā)起和響應(yīng)期間,通過這些過濾器實(shí)現(xiàn)Zuul的功能。具體有以下四個(gè):

  1. PRE過濾器:在請(qǐng)求路由到具體的服務(wù)之前執(zhí)行,用途:安全驗(yàn)證(身份校驗(yàn),參數(shù)校驗(yàn)、ip黑白名單);

  2. ROUTING過濾器 :在請(qǐng)求的服務(wù)到具體的微服務(wù)實(shí)例時(shí)執(zhí)行,用途:進(jìn)行網(wǎng)絡(luò)請(qǐng)求(默認(rèn)使用HttpClient);

  3. POST過濾器:在請(qǐng)求路由到微服務(wù)之后執(zhí)行,用途:統(tǒng)計(jì)信息,回傳響應(yīng);

  4. ERROR過濾器:在其他過濾器發(fā)生錯(cuò)誤的時(shí)候執(zhí)行,用途:保證請(qǐng)求能夠正確響應(yīng);

ZuulFilter中的方法有以下四個(gè),繼承ZuulFilter并且重寫以下四個(gè)方法即可實(shí)現(xiàn)一個(gè)過濾器。

  1. public String filterType(); 返回該Filter的類型,即如上四種過濾器。

  2. public int filterOrder(); 返回該過濾器的執(zhí)行順序。

  3. public boolean shouldFilter(); 返回該過濾器是否需要執(zhí)行。

  4. public Object run(); 執(zhí)行具體的過濾邏輯。

ZuulServlet是Zuul的核心Servlet,負(fù)責(zé)初始化ZuulFilter并且編排這些過濾器,具體代碼在service()方法中。

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        try {
            this.init((HttpServletRequest)servletRequest, (HttpServletResponse)servletResponse);
            RequestContext context = RequestContext.getCurrentContext();
            context.setZuulEngineRan();

            try {
                this.preRoute();
            } catch (ZuulException var13) {
                this.error(var13);
                this.postRoute();
                return;
            }

            try {
                this.route();
            } catch (ZuulException var12) {
                this.error(var12);
                this.postRoute();
                return;
            }

            try {
                this.postRoute();
            } catch (ZuulException var11) {
                this.error(var11);
            }
        } catch (Throwable var14) {
            this.error(new ZuulException(var14, 500, "UNHANDLED_EXCEPTION_" + var14.getClass().getName()));
        } finally {
            RequestContext.getCurrentContext().unset();
        }
    }

RequestContextZuulFilter中負(fù)責(zé)上下文銜接的角色,其本身是一個(gè)ConcurrentHashMap,包含Request和Response、routeType、routeHost等上下文需要的對(duì)象。

三、項(xiàng)目實(shí)戰(zhàn)

(1)項(xiàng)目搭建
  • 父級(jí)項(xiàng)目zuul-test/pom.xml

<groupId>com.calvin.zuul</groupId>
<artifactId>zuul-test</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
    <module>eureka-server</module>
    <module>user-service</module>
    <module>zuul-service</module>
</modules>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.3.RELEASE</version>
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  • zuul-service/pom.xml

<parent>
    <artifactId>zuul-test</artifactId>
    <groupId>com.calvin.zuul</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>zuul-service</artifactId>

<dependencies>
    <!-- Springboot支持-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--SpringCloud支持 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zuul</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
  • zuul-service/ZuulApplication.java

/**
 * <p>
 *     啟動(dòng)類
 * </p>
 * @author Calvin
 * @date 2019/10/25
 * @since 1.0
 */
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulServerApplication.class, args);
    }
}
  • zuul-service/application.yml

spring:
  application:
    name: zuul-service
server:
  port: 8030
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8010/eureka/
  instance:
    hostname: localhost
zuul:
  routes:
    user-api:
      path: /user/**
      serviceId: user-service
  • user-service/pom.xml

<parent>
    <artifactId>zuul-test</artifactId>
    <groupId>com.calvin.zuul</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-service</artifactId>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
  • user-service/application.yml

spring:
  application:
    name: user-service
server:
  port: 8020
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8010/eureka/
  instance:
    hostname: localhost
  • user-service/UserApplication.java

/**
 * <p>
 *      啟動(dòng)類
 * </p>
 * @author Calvin
 * @date 2019/10/25
 * @since 1.0
 */
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class UserApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}
  • user-service/controller/UserController.java

/**
 * <p> </p>
 *
 * @author Calvin
 * @date 2019/10/25
 * @since
 */
@RestController
public class UserController {

    /**
     * 簡(jiǎn)單構(gòu)建一個(gè)User
     */
    @GetMapping("/userDetail/{userId}")
    public SysUser getUserDetail(@PathVariable("userId") String userId){
        SysUser sysUser = new SysUser();
        sysUser.setId(userId);
        sysUser.setAge(20);
        sysUser.setPassword(MD5Utils.digestAsHex("123456"));
        sysUser.setUsername("Calvin");
        //圖片來自百度
        sysUser.setHeadImg("https://b-ssl.duitang.com/uploads/item/201510/17/20151017181645_c5hWE.thumb.700_0.jpeg");
        return sysUser;
    }
}
(2)智能路由

依次啟動(dòng)eureka-server, user-server, zuul-server
瀏覽器調(diào)用 http://localhost:8030/user/userDetail/1 SpringCloud中如何使用Zuul路由網(wǎng)關(guān)

從調(diào)用結(jié)果中可以看到我們從zuul-service中調(diào)用了user-service的方法,并且調(diào)用成功。從而證明路由配置可用;
如需配置版本號(hào),我們只需要咱zuul-service/application.yml中添加配置:zuul.prefix=v1

(3)故障熔斷

如果需要在Zuul中實(shí)現(xiàn)服務(wù)熔斷,只需要實(shí)現(xiàn)ZuulFallbackProvider接口,重寫其中兩個(gè)方法,通過getRoute()方法返回我們需要熔斷的路由,通過fallbackResponse()方法來重寫熔斷時(shí)執(zhí)行的邏輯。

如下,我們實(shí)現(xiàn)第一個(gè)user-service的熔斷器

/**
 * <p>
 *    user-service熔斷器
 * </p>
 *
 * @author Calvin
 * @date 2019/10/27
 * @since
 */
@Component
public class UserServiceCallback implements ZuulFallbackProvider {
    @Override
    public String getRoute() {
        return "user-service";
    }

    @Override
    public ClientHttpResponse fallbackResponse() {
        return new CommonClientResponse();
    }
}

貼上CommonClientResponse的代碼,就是針對(duì)ClientHttpResponse接口的封裝

/**
 * <p>封裝的通用返回類 </p>
 *
 * @author Calvin
 * @date 2019/10/27
 * @since
 */
public class CommonClientResponse implements ClientHttpResponse {


    @Override
    public HttpStatus getStatusCode() throws IOException {
        return HttpStatus.OK;
    }

    @Override
    public int getRawStatusCode() throws IOException {
        return 0;
    }

    @Override
    public String getStatusText() throws IOException {
        return "success";
    }

    @Override
    public void close() {
    }

    @Override
    public InputStream getBody() throws IOException {
        return new ByteArrayInputStream("hello , this is zuul fallback".getBytes());
    }

    @Override
    public HttpHeaders getHeaders() {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        return headers;
    }
}

接下來做個(gè)測(cè)試,我們停掉user-service服務(wù),然后再訪問 http://localhost:8030/user/userDetail/1 SpringCloud中如何使用Zuul路由網(wǎng)關(guān)
結(jié)果當(dāng)然是我們定義的熔斷器中返回的內(nèi)容了!

如果需要對(duì)其他服務(wù)使用同一個(gè)熔斷器,只需要在getRoute()方法中返回通配符 return "*"就可以了 ?

網(wǎng)關(guān)測(cè)試

ZuulFilter是Zuul實(shí)現(xiàn)過濾和網(wǎng)關(guān)的關(guān)鍵,此類有四個(gè)枚舉值,分別代表Zuul中的過濾器類型。如果需要實(shí)現(xiàn)過濾,只需要繼承ZuulFilter,并且指定其過濾器類型,枚舉值為:

	/**
	 * {@link ZuulFilter#filterType()} error type.
	 */
	String ERROR_TYPE = "error";

	/**
	 * {@link ZuulFilter#filterType()} post type.
	 */
	String POST_TYPE = "post";

	/**
	 * {@link ZuulFilter#filterType()} pre type.
	 */
	String PRE_TYPE = "pre";

	/**
	 * {@link ZuulFilter#filterType()} route type.
	 */
	String ROUTE_TYPE = "route";

簡(jiǎn)單實(shí)現(xiàn)一個(gè)過濾器

/**
 * <p> header過濾器 </p>
 *
 * @author Calvin
 * @date 2019/10/27
 * @since
 */
@Component
public class TokenFilter extends ZuulFilter {


    private static final Logger logger = LoggerFactory.getLogger(TokenFilter.class);
    @Override
    public String filterType() {
        return PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        logger.info("request_url : {}, request_headers: {}",request.getRequestURI(), JSON.toJSON(request.getHeaderNames()).toString());
        return null;
    }
}

重新啟動(dòng)zuul-service,調(diào)用服務(wù)控制臺(tái)已經(jīng)可以輸出如下內(nèi)容:

2019-11-12 22:04:36.726  INFO 58984 --- [nio-8030-exec-4] com.calvin.zuul.filter.TokenFilter       : request_url : /user/userDetail/1, request_headers: ["host","connection","cache-control","upgrade-insecure-requests","user-agent","sec-fetch-user","accept","sec-fetch-site","sec-fetch-mode","accept-encoding","accept-language","cookie"]

若需要攔截請(qǐng)求,或者設(shè)置白名單等,在RequestContext中設(shè)置好自己的statusCode等,就可以了

requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(401);
ctx.getResponse().getWriter().write("there is no token found,please relogin!")

看完上述內(nèi)容,你們掌握SpringCloud中如何使用Zuul路由網(wǎng)關(guān)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享題目:SpringCloud中如何使用Zuul路由網(wǎng)關(guān)
文章位置:http://aaarwkj.com/article44/ihhoee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、搜索引擎優(yōu)化商城網(wǎng)站、App設(shè)計(jì)軟件開發(fā)、網(wǎng)站收錄

廣告

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

外貿(mào)網(wǎng)站制作
久久精品一区二区三区不卡| 国产精品一区午夜福利| 国产老熟女高潮精品视频网站免费 | 日韩精品诱惑一区二区| 不卡的视频在线观看| 国产午夜男人天堂手机| 国产偷自一区二区三区| 亚洲欧美日韩国产桃色| 国产精品天干天综合网| 九九九视频精品免费九九| 不卡视频一区中文字幕| 久久精品国产亚洲av超一| 精品视频美女肉体亚洲| 亚洲熟妇亚洲熟妇亚洲熟妇| 一区二区三区视频在线国产| 日本免费精品人成视频| 成人在线午夜你懂的视频| 日本久久久视频在线观看| 四虎永久播放地址免费| 97在线视频观看视频在线| 懂色av中文一区二区| 欧美精品一区二区亚洲| 国产成年人免费小视频| 精品人妻少妇av一区二区| 蜜桃免费观看在线视频| 国产精品一区二区激情视频| 人妻日韩精品综合一二三四| 伊人狼人综合视频在线播放| 欧美亚洲午夜一二综合| 在线观看午夜视频免费| 日韩午夜免费一区二区蜜桃| av欧美激情在线观看| 国产精品乱码精品久久久| 99久久精彩免费视频| 亚洲婷婷综合精品五月天| 精品免费av在线播放| 欧美亚洲另类激情另类的| 色综合色狠狠天天综合色| 色综合久久天天射天天干| 国产白丝免费在线观看| 日韩人妻中文字幕乱码一区|