最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Zuul實(shí)現(xiàn)服務(wù)網(wǎng)關(guān)路由全過程

 更新時(shí)間:2025年07月17日 09:58:21   作者:小凱  ?  
文章介紹了微服務(wù)架構(gòu)中路由層的作用,Spring Cloud Zuul作為Netflix的動(dòng)態(tài)路由和負(fù)載均衡器,雖有Zuul 2,但Spring Cloud Gateway已成為更推薦的網(wǎng)關(guān)方案,強(qiáng)調(diào)路由層的高可用性對(duì)系統(tǒng)穩(wěn)定性至關(guān)重要

前言

為什么會(huì)有路由層?

因?yàn)樵谖⒎?wù)架構(gòu)設(shè)計(jì)中,往往并不會(huì)直接將服務(wù)暴漏給調(diào)用端,而是通過調(diào)用路由層進(jìn)行業(yè)務(wù)隔離,以達(dá)到不同的業(yè)務(wù)調(diào)用對(duì)應(yīng)的服務(wù)模塊。

Spring Cloud Zuul

Spring Cloud Zuul 路由是微服務(wù)架構(gòu)的不可或缺的一部分,提供動(dòng)態(tài)路由、監(jiān)控、彈性、安全等的邊緣服務(wù)。

Zuul 是 Netflix 出品的一個(gè)基于 JVM 路由和服務(wù)端的負(fù)載均衡器。


環(huán)境準(zhǔn)備

1.jdk 1.8、idea2018、Maven3

2.Spring Boot 2.0.6.RELEASE

3.Spring Cloud Finchley.SR2

代碼示例

itstack-demo-springcloud-08
├── itstack-demo-springcloud-eureka-client
│   └── src
│       └── main
│           ├── java
│           │   └── org.itstack.demo
│           │        ├── web
│           │        │   └── EurekaClientController.java
│           │        └── EurekaClientApplication.java
│           └── resources   
│               └── application.yml
├── itstack-demo-springcloud-eureka-server
│   └── src
│       └── main
│           ├── java
│           │   └── org.itstack.demo
│           │        └── EurekaServerApplication.java
│           └── resources   
│               └── application.yml
├── itstack-demo-springcloud-hystrix-feign
│   └── src
│       └── main
│           ├── java
│           │   └── org.itstack.demo
│           │        ├── service
│           │        │   ├── hystrix
│           │        │   │   └── FeignServiceHystrix.java
│           │        │   └── FeignService.java
│           │        ├── web
│           │        │   └── FeignController.java
│           │        └── FeignApplication.java
│           └── resources   
│               └── application.yml
├── itstack-demo-springcloud-hystrix-ribbon
│   └── src
│       └── main
│           ├── java
│           │   └── org.itstack.demo
│           │        ├── service
│           │        │   └── RibbonService.java
│           │        ├── web
│           │        │   └── RibbonController.java      
│           │        └── RibbonApplication.java
│           └── resources   
│               └── application.yml
└── itstack-demo-springcloud-zuul
    └── src
        └── main
            ├── java
            │   └── org.itstack.demo   
            │        └── ZuulApplication.java
            └── resources   
                └── application.yml

itstack-demo-springcloud-eureka-client | 服務(wù)提供方

提供一個(gè)查詢用戶信息的簡(jiǎn)單方法,在配置文件中通過修改端口啟動(dòng)2次,模擬雙實(shí)例應(yīng)用,為調(diào)用方負(fù)載做準(zhǔn)備。

  • web/EurekaClientController.java & 注意@EnableEurekaClient用于向注冊(cè)中心提供服務(wù)
@EnableEurekaClient
@RestController
public class EurekaClientController {

    @Value("${server.port}")
    private int port;

    @RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)
    public String queryUserInfo(@RequestParam String userId) {
        return "Hi 微信公眾號(hào):bugstack蟲洞棧 | " + userId + " >: from eureka client port: " + port;
    }

}
  • EurekaClientApplication.java & 服務(wù)啟動(dòng)類
@SpringBootApplication
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }

}
 
  • pom.xml & 配置文件指向注冊(cè)中心
server:
  port: 8001

spring:
  application:
    name: itstack-demo-springcloud-eureka-client

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7397/eureka/

itstack-demo-springcloud-eureka-server | 單個(gè)服務(wù)注冊(cè)中心

服務(wù)注冊(cè)中心用于承載接口提供方向上注冊(cè),同時(shí)正在調(diào)用方鏈接后可以獲取指定應(yīng)用的服務(wù)實(shí)例。

  • EurekaServerApplication.java & 通過注解@EnableEurekaServer啟動(dòng)服務(wù)注冊(cè)與發(fā)現(xiàn)中心
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run( EurekaServerApplication.class, args );
    }

}
  • pom.xml & 服務(wù)注冊(cè)中心
server:
  port: 7397

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

spring:
  application:
    name: itstack-demo-springcloud-eureka-server

itstack-demo-springcloud-feign | Feign服務(wù)調(diào)用方

Feign 是一個(gè)聲明式的 Web Service 客戶端,它的目的就是讓 Web Service 調(diào)用更加簡(jiǎn)單。它整合了 Ribbon 和 Hystrix,從而讓我們不再需要顯式地使用這兩個(gè)組件。Feign 還提供了 HTTP 請(qǐng)求的模板,通過編寫簡(jiǎn)單的接口和插入注解,我們就可以定義好 HTTP 請(qǐng)求的參數(shù)、格式、地址等信息。接下來,F(xiàn)eign 會(huì)完全代理 HTTP 的請(qǐng)求,我們只需要像調(diào)用方法一樣調(diào)用它就可以完成服務(wù)請(qǐng)求。

Feign 具有如下特性:

可插拔的注解支持,包括 Feign 注解和 JAX-RS 注解 支持可插拔的 HTTP 編碼器和解碼器 支持 Hystrix 和它的 Fallback 支持 Ribbon 的負(fù)載均衡 支持 HTTP 請(qǐng)求和響應(yīng)的壓縮

service/FeignService.java |

注解方式調(diào)用,方便易用。@FeignClient會(huì)在調(diào)用時(shí)進(jìn)行解析服務(wù)到具體的http://ip:port/

@FeignClient(value = "itstack-demo-springcloud-eureka-client", fallback = FeignServiceHystrix.class)
public interface FeignService {

    @RequestMapping(value = "/api/queryUserInfo", method = RequestMethod.GET)
    String queryUserInfo(@RequestParam String userId);

}
  • service/hystrix/FeignServiceHystrix.java | 提供熔斷服務(wù),當(dāng)發(fā)生異常時(shí)主動(dòng)返回預(yù)定結(jié)果
@Component
public class FeignServiceHystrix implements FeignService {

    @Override
    public String queryUserInfo(String userId) {
        return "queryUserInfo by userId:" + userId + " err!from feign hystrix";
    }
    
}
  • web/FeignController.java | 使用接口提供服務(wù) From Feign
@RestController
public class FeignController {

    @Resource
    private FeignService ribbonService;

    @RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)
    public String queryUserInfo(@RequestParam String userId) {
        return ribbonService.queryUserInfo(userId) + " From Feign";
    }

}

FeignApplication.java |

  • 注解@EnableEurekaClient、@EnableFeignClients、@EnableDiscoveryClient獲取調(diào)用注冊(cè)中心服務(wù)
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrix
public class FeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class, args);
    }

}
  • application.yml | eureka服務(wù)配置,從注冊(cè)中心獲取可用服務(wù)。開啟hystrix=true
server:
  port: 9001

spring:
  application:
    name: itstack-demo-springcloud-feign

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7397/eureka/

feign.hystrix.enabled: true

itstack-demo-springcloud-ribbon | Ribbon服務(wù)調(diào)用方

Ribbon是一個(gè)基于 HTTP 和 TCP 的客戶端負(fù)載均衡器。它可以通過在客戶端中配置 ribbonServerList 來設(shè)置服務(wù)端列表去輪詢?cè)L問以達(dá)到均衡負(fù)載的作用。

當(dāng) Ribbon 與 Eureka 聯(lián)合使用時(shí),ribbonServerList 會(huì)被 DiscoveryEnabledNIWSServerList 重寫,擴(kuò)展成從 Eureka 注冊(cè)中心中獲取服務(wù)實(shí)例列表。同時(shí)它也會(huì)用 NIWSDiscoveryPing 來取代 IPing,它將職責(zé)委托給 Eureka 來確定服務(wù)端是否已經(jīng)啟動(dòng)。

service/RibbonService.java |

  • 接口式硬編碼調(diào)用不太易于維護(hù),因此也是比較少用的方式。hystrix實(shí)際通過getFallback()返回熔斷結(jié)果
@Service
public class RibbonService {

    @Autowired
    private RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "queryUserInfoFallback")
    public String queryUserInfo(String userId) {
        return restTemplate.getForObject("http://ITSTACK-DEMO-SPRINGCLOUD-EUREKA-CLIENT/api/queryUserInfo?userId=" + userId, String.class);
    }

    /**
     * Specifies a method to process fallback logic.
     * A fallback method should be defined in the same class where is HystrixCommand.
     * Also a fallback method should have same signature to a method which was invoked as hystrix command.
     * for example:
     * <code>
     *      @HystrixCommand(fallbackMethod = "getByIdFallback")
     *      public String getById(String id) {...}
     *
     *      private String getByIdFallback(String id) {...}
     * </code>
     * Also a fallback method can be annotated with {@link HystrixCommand}
     * <p/>
     * default => see {@link com.netflix.hystrix.contrib.javanica.command.GenericCommand#getFallback()}
     *
     * @return method name
     *
     * getFallback()
     * 
     * @Override
     * protected Object getFallback() {
     *     final CommandAction commandAction = getFallbackAction();
     *     if (commandAction != null) {
     *         try {
     *             return process(new Action() {
     *                 @Override
     *                 Object execute() {
     *                     MetaHolder metaHolder = commandAction.getMetaHolder();
     *                     Object[] args = createArgsForFallback(metaHolder, getExecutionException());
     *                     return commandAction.executeWithArgs(metaHolder.getFallbackExecutionType(), args);
     *                 }
     *             });
     *         } catch (Throwable e) {
     *             LOGGER.error(FallbackErrorMessageBuilder.create()
     *                     .append(commandAction, e).build());
     *             throw new FallbackInvocationException(unwrapCause(e));
     *         }
     *     } else {
     *         return super.getFallback();
     *     }
     * }
     */
    public String queryUserInfoFallback(String userId) {
        return "queryUserInfo by userId:" + userId + " err!from ribbon hystrix";
    }

}
  • web/RibbonController.java | 使用接口提供服務(wù) From Ribbon
@RestController
public class RibbonController {

    @Resource
    private RibbonService ribbonService;

    @RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)
    public String queryUserInfo(@RequestParam String userId) {
        return ribbonService.queryUserInfo(userId) + " From Ribbon";
    }
    
}

RibbonApplication.java |

  • 通過注解@LoadBalanced注冊(cè)rest模版,用于Ribbon接口調(diào)用。并啟動(dòng)@EnableHystrix
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableHystrix
public class RibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}
  • application.yml | eureka服務(wù)配置,從注冊(cè)中心獲取可用服務(wù)
server:
  port: 9002

spring:
  application:
    name: itstack-demo-springcloud-ribbon

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7397/eureka/

itstack-demo-springcloud-zuul | Zull路由層

Spring Cloud Zuul 路由是微服務(wù)架構(gòu)的不可或缺的一部分,提供動(dòng)態(tài)路由、監(jiān)控、彈性、安全等的邊緣服務(wù)。Zuul 是 Netflix 出品的一個(gè)基于 JVM 路由和服務(wù)端的負(fù)載均衡器。

  • ZuulApplication.java & 路由服務(wù)啟動(dòng)
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
public class ZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }

}
  • pom.mxl & 路由配置
server:
  port: 10001

spring:
  application:
    name: itstack-demo-ddd-zuul

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7397/eureka/

# http://localhost:10001/route-a/api/queryUserInfo?userId=111
# http://localhost:10001/route-b/api/queryUserInfo?userId=111
zuul:
  routes:
    api-a:
      path: /route-a/**
      serviceId: itstack-demo-springcloud-feign
    api-b:
      path: /route-b/**
      serviceId: itstack-demo-springcloud-ribbon

測(cè)試驗(yàn)證

1.分別啟動(dòng)如下系統(tǒng)模擬

  • itstack-demo-springcloud-eureka-server 服務(wù)注冊(cè)發(fā)現(xiàn)中心
  • itstack-demo-springcloud-eureka-client 測(cè)試接口提供方
  • itstack-demo-springcloud-hystrix-feign 接口調(diào)用方Feign
  • itstack-demo-springcloud-hystrix-ribbon 接口調(diào)用方Ribbon
  • itstack-demo-springcloud-zuul 路由服務(wù)

2.測(cè)試接口

  • 訪問Feign、Ribbon接口,驗(yàn)證服務(wù)是否可用;http://localhost:9001/api/queryUserInfo?userId=111、http://localhost:9002/api/queryUserInfo?userId=111
  • 訪問路由接口A;http://localhost:10001/route-a/api/queryUserInfo?userId=111
  • 訪問路由接口B;http://localhost:10001/route-b/api/queryUserInfo?userId=111

Hello| 111 >: from eureka client port: 8001 From Ribbon

綜上總結(jié)

  • zuul目前SpringCloud結(jié)合的是zuul 1, Netflix 已經(jīng)發(fā)布了 Zuul 2但目前還未整合
  • SpringCloud還有自己的網(wǎng)關(guān)服務(wù);Spring Cloud Gateway
  • 通過最上層的路由功能可以很方便的隔離業(yè)務(wù),但是路由層一定是高可用的,否則路由癱瘓整個(gè)服務(wù)將不可用

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot服務(wù)端數(shù)據(jù)校驗(yàn)過程詳解

    SpringBoot服務(wù)端數(shù)據(jù)校驗(yàn)過程詳解

    這篇文章主要介紹了SpringBoot服務(wù)端數(shù)據(jù)校驗(yàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java struts2請(qǐng)求源碼分析案例詳解

    Java struts2請(qǐng)求源碼分析案例詳解

    這篇文章主要介紹了Java struts2請(qǐng)求源碼分析案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • springmvc如何使用map接收參數(shù)

    springmvc如何使用map接收參數(shù)

    這篇文章主要介紹了springmvc如何使用map接收參數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java 代碼實(shí)例解析設(shè)計(jì)模式之監(jiān)聽者模式

    Java 代碼實(shí)例解析設(shè)計(jì)模式之監(jiān)聽者模式

    所謂監(jiān)聽者模式,我理解的是構(gòu)建一個(gè)容器存放所有被監(jiān)聽的線程或?qū)ο螅O(jiān)聽每個(gè)線程或?qū)ο蟀l(fā)生的變化,若某個(gè)線程或?qū)ο笥|發(fā)指定規(guī)則,那么則對(duì)所有被監(jiān)聽的線程或?qū)ο蟾鶕?jù)業(yè)務(wù)需要做處理
    2021-10-10
  • Java ClassCastException異常解決方案

    Java ClassCastException異常解決方案

    這篇文章主要介紹了Java ClassCastException異常解決方案,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 關(guān)于javaWeb中405錯(cuò)誤的解決方法

    關(guān)于javaWeb中405錯(cuò)誤的解決方法

    下面小編就為大家?guī)硪黄P(guān)于javaWeb中405錯(cuò)誤的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 解決@SpringBootTest 單元測(cè)試遇到的坑

    解決@SpringBootTest 單元測(cè)試遇到的坑

    這篇文章主要介紹了解決@SpringBootTest 單元測(cè)試遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java中使用MinIO的常用操作示例

    Java中使用MinIO的常用操作示例

    這篇文章主要介紹了Java中MinIO的常用操作示例,MinIO 是一款基于Go語言發(fā)開的高性能、分布式的對(duì)象存儲(chǔ)系統(tǒng),客戶端支持Java,Net,Python,Javacript, Golang語言,需要的朋友可以參考下
    2024-01-01
  • java實(shí)現(xiàn)從網(wǎng)上下載圖片到本地的方法

    java實(shí)現(xiàn)從網(wǎng)上下載圖片到本地的方法

    這篇文章主要介紹了java實(shí)現(xiàn)從網(wǎng)上下載圖片到本地的方法,涉及java針對(duì)文件操作的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2015-07-07
  • 解析SpringSecurity自定義登錄驗(yàn)證成功與失敗的結(jié)果處理問題

    解析SpringSecurity自定義登錄驗(yàn)證成功與失敗的結(jié)果處理問題

    這篇文章主要介紹了SpringSecurity系列之自定義登錄驗(yàn)證成功與失敗的結(jié)果處理問題,本文通過實(shí)例給大家講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論

龙里县| 石屏县| 宜宾县| 永靖县| 邵东县| 黄大仙区| 淮安市| 甘肃省| 绥滨县| 平和县| 西丰县| 旺苍县| 涿州市| 黑龙江省| 永吉县| 玛纳斯县| 海林市| 徐水县| 饶阳县| 台东县| 秦安县| 达日县| 隆安县| 县级市| 琼海市| 桑植县| 柳州市| 屯留县| 迁西县| 瑞昌市| 灵寿县| 若尔盖县| 南康市| 绥中县| 栖霞市| 易门县| 长治县| 台江县| 胶州市| 潮州市| 金湖县|