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

SpringCloud如何實(shí)現(xiàn)Zuul集群(負(fù)載均衡)

 更新時間:2021年07月05日 08:52:32   作者:王小白_Ada  
這篇文章主要介紹了SpringCloud如何實(shí)現(xiàn)Zuul集群(負(fù)載均衡)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

前言:

在微服務(wù)架構(gòu)中,有一個組件可以說是必不可少的,那就是微服務(wù)網(wǎng)關(guān),微服務(wù)網(wǎng)關(guān)處理了負(fù)載均衡,緩存,路由,訪問控制,服務(wù)代理,監(jiān)控,日志等。API網(wǎng)關(guān)在微服務(wù)架構(gòu)中正是以微服務(wù)網(wǎng)關(guān)的身份存在。

一般在微服務(wù)架構(gòu)中,網(wǎng)關(guān)都是部署多個服務(wù)的,以實(shí)現(xiàn)負(fù)載均衡和保證高可用。

一、使用 Nginx+Zuul 實(shí)現(xiàn)網(wǎng)關(guān)集群

1.互聯(lián)網(wǎng)公司中網(wǎng)關(guān)都是集群 搭建集群: Nginx+Zuul 一主一備,或者輪詢多個。

2.在微服務(wù)中,所有服務(wù)請求都會統(tǒng)一請求到Zuul網(wǎng)關(guān)上。

圖示:

過程:客戶端發(fā)送請求統(tǒng)一到Nginx上,在使用Nginx實(shí)現(xiàn)反向代理和負(fù)載均衡,采用輪詢算法轉(zhuǎn)發(fā)到網(wǎng)關(guān)上。

1.創(chuàng)建Eurek注冊中心、會員服務(wù)、訂單服務(wù) (略)

搭建Zull集群前,應(yīng)該對Eureka注冊中心,以及創(chuàng)建SpringBoot項(xiàng)目應(yīng)該有了解,這里就不一 一贅述了。

實(shí)際上創(chuàng)建會員服務(wù)、訂單服務(wù)這一步可以省略,因?yàn)槲覀儍H僅是為了演示Nginx對Zuul網(wǎng)關(guān)的負(fù)載均衡效果。

會員服務(wù)配置:

過程:客戶端發(fā)送請求統(tǒng)一到Nginx上,在使用Nginx實(shí)現(xiàn)反向代理和負(fù)載均衡,采用輪詢算法轉(zhuǎn)發(fā)到網(wǎng)關(guān)上。1.創(chuàng)建Eurek注冊中心、會員服務(wù)、訂單服務(wù) (略)

搭建Zull集群前,應(yīng)該對Eureka注冊中心,以及創(chuàng)建SpringBoot項(xiàng)目應(yīng)該有了解,這里就不一 一贅述了。實(shí)際上創(chuàng)建會員服務(wù)、訂單服務(wù)這一步可以省略,因?yàn)槲覀儍H僅是為了演示Nginx對Zuul網(wǎng)關(guān)的負(fù)載均衡效果。

會員服務(wù)配置:

#會員服務(wù)
server:
  port: 8082
spring:
  application:
    name: member-service    #服務(wù)名
#Eureka配置
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/     #注冊中心的地址

訂單服務(wù):

#訂單服務(wù)
server:
  port: 8081
spring:
  application:
    name: order-service   #服務(wù)名
#Eureka配置
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/      #注冊中心地址

2. 創(chuàng)建Zuul服務(wù)

application.yml文件中配置 (Zull的配置生產(chǎn)時一般是放到配置中心中)

#配置Zuul端口
server:
  port: 81
spring:
  application:
    name: zull-gateway-service    #服務(wù)名
#Eureka配置
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/    #注冊中心地址
      
# 配置網(wǎng)關(guān)反向代理,例如訪問/api-member/** 直接重定向到member-service服務(wù),實(shí)現(xiàn)路由轉(zhuǎn)發(fā),隱藏服務(wù)的真實(shí)ip(服務(wù)都實(shí)在內(nèi)網(wǎng)中)
#zull根據(jù)服務(wù)名,去Eureka獲取服務(wù)真實(shí)地址,并通過本地轉(zhuǎn)發(fā),而且默認(rèn)開啟Ribbon實(shí)現(xiàn)負(fù)載均衡
#默認(rèn)讀取Eureka注冊列表 默認(rèn)30秒間隔  
zuul:
 routes:
   api-a: #會員服務(wù)網(wǎng)關(guān)配置
     path: /api-member/**   #訪問只要是/api-member/ 開頭的直接轉(zhuǎn)發(fā)到member-service服務(wù)
     #服務(wù)名
     serviceId: member-service
   api-b: #訂單服務(wù)網(wǎng)關(guān)配置
     path: /api-order/**
     serviceId: order-service

創(chuàng)建TokenFilet類繼承ZuulFilter,在run方法中輸入網(wǎng)關(guān)的端口,調(diào)用服務(wù)時方便查看Nginx轉(zhuǎn)發(fā)到哪個網(wǎng)關(guān)

package com.example.zuul.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import io.micrometer.core.instrument.util.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component
public class TokenFilter extends ZuulFilter {
	//統(tǒng)計(jì)當(dāng)前Zuul調(diào)用次數(shù)
    int count = 0;
    
	//獲取Zuul服務(wù)端口號
    @Value("${server.port}")
    private String prot;
    
    /**
     * 指定該Filter的類型
     * ERROR_TYPE = "error";
     * POST_TYPE = "post";
     * PRE_TYPE = "pre";
     * ROUTE_TYPE = "route";
     */
    @Override
    public String filterType() {
        System.out.println("filterType()...");
        return "pre";
    }
    /**
     * 指定該Filter執(zhí)行的順序(Filter從小到大執(zhí)行)
     * DEBUG_FILTER_ORDER = 1;
     * FORM_BODY_WRAPPER_FILTER_ORDER = -1;
     * PRE_DECORATION_FILTER_ORDER = 5;
     * RIBBON_ROUTING_FILTER_ORDER = 10;
     * SEND_ERROR_FILTER_ORDER = 0;
     * SEND_FORWARD_FILTER_ORDER = 500;
     * SEND_RESPONSE_FILTER_ORDER = 1000;
     * SIMPLE_HOST_ROUTING_FILTER_ORDER = 100;
     * SERVLET_30_WRAPPER_FILTER_ORDER = -2;
     * SERVLET_DETECTION_FILTER_ORDER = -3;
     */
    @Override
    public int filterOrder() {
        System.out.println("filterOrder()...");
        return 0;
    }
    /**
     * 指定需要執(zhí)行該Filter的規(guī)則
     * 返回true則執(zhí)行run()
     * 返回false則不執(zhí)行run()
     */
    @Override
    public boolean shouldFilter() {
        System.out.println("shouldFilter()...");
        return true;
    }
    /**
     * 該Filter具體的執(zhí)行活動
     */
    @Override
    public Object run() throws ZuulException {
        // 獲取上下文
        //RequestContext currentContext = RequestContext.getCurrentContext();
        //HttpServletRequest request = currentContext.getRequest();
        //獲取userToken
       // String userToken = request.getParameter("userToken");
        //System.out.println("userToken: "+userToken);
        //if (StringUtils.isEmpty(userToken)) {
            //不會繼續(xù)執(zhí)行調(diào)用服務(wù)接口,網(wǎng)關(guān)直接響應(yīng)給客戶端
            //currentContext.setSendZuulResponse(false);
            //currentContext.setResponseStatusCode(401);
           // currentContext.setResponseBody("userToken is Null");
           // return null;
       // }else if(!userToken.equals("10010")){
           // currentContext.setSendZuulResponse(false);
            //currentContext.setResponseStatusCode(401);
            //currentContext.setResponseBody("userToken is Error");
            //return null;
        //}
        // 否則正常執(zhí)行業(yè)務(wù)邏輯,調(diào)用服務(wù).....
        System.out.println("訪問Zuul網(wǎng)關(guān)端口為:"+prot +"(total:"+ ( count++) +")");
        return null;
    }
}

啟動兩個Zuul服務(wù),端口號分別為81和82

3. 下載Nginx服務(wù)器

這里演示使用Windows版本,Linux安裝也很簡單,后面操作都一樣。

windows版下載地址:http://nginx.org/en/download.html

在這里插入圖片描述

下載好后解壓,進(jìn)入conf目錄找到nginx.conf文件打開,配置如下:

#配置上游服務(wù)器 集群,默認(rèn)輪詢機(jī)制
	upstream backServer{
		server 127.0.0.1:81;
		server 127.0.0.1:82;
		# 補(bǔ)充: backup表示從服務(wù)器或者叫備用服務(wù)器  只有當(dāng)主服務(wù)器(81、82端口)都不能訪問時才會訪問此(83端口)備用服務(wù)器 當(dāng)主服務(wù)器恢復(fù)正常后 則訪問主服務(wù)器
		#server 127.0.0.1:83 backup;
	}
    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            ##root   html;
			#指定上游負(fù)載均衡服務(wù)器
			proxy_pass http://backServer/;
            index  index.html index.htm;
        }
    }

雙擊nginx.exe啟動Nginx服務(wù)器

二、 測試

瀏覽器訪問http://localhost/api-member

我們可以看到兩個網(wǎng)關(guān)分別輸出了日志,實(shí)現(xiàn)了負(fù)載均衡

在這里插入圖片描述

在這里插入圖片描述

我們看到訪問的次數(shù)不一樣,這其實(shí)和使用Google瀏覽器有關(guān),可以換其他瀏覽器試試。

三、補(bǔ)充

Nginx和網(wǎng)關(guān)的區(qū)別在什么地方?

1、都可以實(shí)現(xiàn)反向代理。

2、都可以實(shí)現(xiàn)負(fù)載均衡,Nginx是服務(wù)端負(fù)載均衡,Zuul是本地負(fù)載均衡。

Nginx也可以實(shí)現(xiàn)網(wǎng)關(guān),為什么不用Nginx實(shí)現(xiàn)網(wǎng)關(guān)呢?

因?yàn)槲⒎?wù)網(wǎng)關(guān)是針對整個微服務(wù)實(shí)現(xiàn)統(tǒng)一的請求攔截,網(wǎng)關(guān)基本上都是采用自己熟悉的語言開發(fā)的,目的方便易學(xué)。

網(wǎng)關(guān)的作用:

1、網(wǎng)關(guān)對所有服務(wù)會話進(jìn)行攔截

2、網(wǎng)關(guān)安全控制、統(tǒng)一異常處理、xxs、sql注入

3、權(quán)限控制、黑名單和白名單、性能監(jiān)控、日志打印等

關(guān)于Nginx負(fù)載均衡故障轉(zhuǎn)移:

設(shè)置備用服務(wù)器(主從架構(gòu)),只有當(dāng)所有主服務(wù)器不可用時才會負(fù)載到備服務(wù)器,當(dāng)主服務(wù)器恢復(fù)正常時則負(fù)載到主服務(wù)器。

upstream backServer{
		server 127.0.0.1:81;
		server 127.0.0.1:82;
		# 補(bǔ)充: backup表示從服務(wù)器或者叫備用服務(wù)器  只有當(dāng)主服務(wù)器(81、82端口)都不能訪問時才會訪問此(83端口)備用服務(wù)器 當(dāng)主服務(wù)器恢復(fù)正常后 則訪問主服務(wù)器
		server 127.0.0.1:83 backup;
	}

設(shè)置Nginx轉(zhuǎn)發(fā)請求超時時間

upstream backServer{
		server 127.0.0.1:81;
		server 127.0.0.1:82;
		server 127.0.0.1:83 backup;
	}
	
location / {
        proxy_pass   http://backServer/;
        proxy_redirect  default;
	    proxy_connect_timeout 1;  # 超時1s則轉(zhuǎn)發(fā)到其他服務(wù),宕機(jī)情況下也適用
	    proxy_read_timeout 1;
	    proxy_send_timeout 1;

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

相關(guān)文章

  • MyBatis sql中test如何判斷Boolean

    MyBatis sql中test如何判斷Boolean

    這篇文章主要介紹了MyBatis sql中test如何判斷Boolean,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 使用jenkins部署springboot項(xiàng)目的方法步驟

    使用jenkins部署springboot項(xiàng)目的方法步驟

    這篇文章主要介紹了使用jenkins部署springboot項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java -jar設(shè)置添加啟動參數(shù)實(shí)現(xiàn)方法

    java -jar設(shè)置添加啟動參數(shù)實(shí)現(xiàn)方法

    這篇文章主要介紹了java -jar設(shè)置添加啟動參數(shù)實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • @Autowired注入為null的原因與解決方法

    @Autowired注入為null的原因與解決方法

    我們經(jīng)常會通過@Autowired注解將某個類注到另一個類中,但是會發(fā)現(xiàn)注不進(jìn)去,報(bào)NULL,所以本文就給大家分析了@Autowired 注入為null 的原因與解決方法,需要的朋友可以參考下
    2023-09-09
  • Java中線程Thread的特點(diǎn)及使用

    Java中線程Thread的特點(diǎn)及使用

    這篇文章主要介紹了Java中線程的特點(diǎn)及使用,線程是進(jìn)程的組成部分,一個進(jìn)程可以擁有多個線程,而一個線程必須擁有一個父進(jìn)程,那么線程該如何使用,讓我們一起來看看吧
    2023-04-04
  • Java基礎(chǔ):流Stream詳解

    Java基礎(chǔ):流Stream詳解

    Stream流是數(shù)據(jù)渠道,用于操作數(shù)據(jù)源(集合、數(shù)組等)所生成的元素序列。這篇文章主要介紹了Java8新特性Stream流的相關(guān)資料,需要的朋友參考下吧
    2021-09-09
  • fastjson全局日期序列化設(shè)置導(dǎo)致JSONField失效問題解決方案

    fastjson全局日期序列化設(shè)置導(dǎo)致JSONField失效問題解決方案

    這篇文章主要介紹了fastjson通過代碼指定全局序列化返回時間格式,導(dǎo)致使用JSONField注解標(biāo)注屬性的特殊日期返回格式失效問題的解決方案
    2023-01-01
  • 關(guān)于java的九個預(yù)定義Class對象

    關(guān)于java的九個預(yù)定義Class對象

    這篇文章主要介紹了關(guān)于java的九個預(yù)定義Class對象,在Java中,沒有類就無法做任何事情。然而,并不是所有的類都具有面向?qū)ο筇卣?。如Math.random,并只需要知道方法名和參數(shù),需要的朋友可以參考下
    2023-05-05
  • JavaAgent原理及實(shí)踐分享

    JavaAgent原理及實(shí)踐分享

    這篇文章主要介紹了JavaAgent原理及實(shí)踐,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • IDEA創(chuàng)建yml文件不顯示小樹葉創(chuàng)建失敗問題的解決方法

    IDEA創(chuàng)建yml文件不顯示小樹葉創(chuàng)建失敗問題的解決方法

    這篇文章主要介紹了IDEA創(chuàng)建yml文件不顯示小樹葉創(chuàng)建失敗問題的解決方法,需要的朋友可以參考下
    2020-07-07

最新評論

澳门| 扬州市| 灵台县| 阳高县| 无为县| 伊春市| 新源县| 浮梁县| 鞍山市| 青铜峡市| 蕉岭县| 涞源县| 河曲县| 滁州市| 郸城县| 贡嘎县| 武陟县| 盐边县| 三原县| 旬阳县| 黔西| 平邑县| 全南县| 霞浦县| 新和县| 峨山| 远安县| 衡阳县| 巫溪县| 蒙阴县| 托克逊县| 西乡县| 边坝县| 凌海市| 郴州市| 河北省| 安徽省| 三原县| 湘西| 安顺市| 台东县|