亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言:

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

一般在微服務架構中,網關都是部署多個服務的,以實現(xiàn)負載均衡和保證高可用。

一、使用 Nginx+Zuul 實現(xiàn)網關集群

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

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

圖示:

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

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

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

實際上創(chuàng)建會員服務、訂單服務這一步可以省略,因為我們僅僅是為了演示Nginx對Zuul網關的負載均衡效果。

會員服務配置:

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

搭建Zull集群前,應該對Eureka注冊中心,以及創(chuàng)建SpringBoot項目應該有了解,這里就不一 一贅述了。實際上創(chuàng)建會員服務、訂單服務這一步可以省略,因為我們僅僅是為了演示Nginx對Zuul網關的負載均衡效果。

會員服務配置:

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

訂單服務:

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

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

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

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

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

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)計當前Zuul調用次數(shù)
    int count = 0;
    
	//獲取Zuul服務端口號
    @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í)行調用服務接口,網關直接響應給客戶端
            //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è)務邏輯,調用服務.....
        System.out.println("訪問Zuul網關端口為:"+prot +"(total:"+ ( count++) +")");
        return null;
    }
}

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

3. 下載Nginx服務器

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

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

在這里插入圖片描述

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

#配置上游服務器 集群,默認輪詢機制
	upstream backServer{
		server 127.0.0.1:81;
		server 127.0.0.1:82;
		# 補充: backup表示從服務器或者叫備用服務器  只有當主服務器(81、82端口)都不能訪問時才會訪問此(83端口)備用服務器 當主服務器恢復正常后 則訪問主服務器
		#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;
			#指定上游負載均衡服務器
			proxy_pass http://backServer/;
            index  index.html index.htm;
        }
    }

雙擊nginx.exe啟動Nginx服務器

二、 測試

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

我們可以看到兩個網關分別輸出了日志,實現(xiàn)了負載均衡

在這里插入圖片描述

在這里插入圖片描述

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

三、補充

Nginx和網關的區(qū)別在什么地方?

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

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

Nginx也可以實現(xiàn)網關,為什么不用Nginx實現(xiàn)網關呢?

因為微服務網關是針對整個微服務實現(xiàn)統(tǒng)一的請求攔截,網關基本上都是采用自己熟悉的語言開發(fā)的,目的方便易學。

網關的作用:

1、網關對所有服務會話進行攔截

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

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

關于Nginx負載均衡故障轉移:

設置備用服務器(主從架構),只有當所有主服務器不可用時才會負載到備服務器,當主服務器恢復正常時則負載到主服務器。

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

設置Nginx轉發(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則轉發(fā)到其他服務,宕機情況下也適用
	    proxy_read_timeout 1;
	    proxy_send_timeout 1;

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java中notify和notifyAll的區(qū)別及何時使用

    Java中notify和notifyAll的區(qū)別及何時使用

    本文主要介紹了Java中notify和notifyAll的區(qū)別及何時使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java線程中賣火車票問題的深入講解

    Java線程中賣火車票問題的深入講解

    這篇文章主要給大家介紹了關于Java線程中賣火車票問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Java判斷兩個浮點數(shù)相等

    Java判斷兩個浮點數(shù)相等

    本文主要介紹了Java判斷兩個浮點數(shù)相等,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • 詳解Java設計模式之橋接模式

    詳解Java設計模式之橋接模式

    橋接,顧名思義,就是用來連接兩個部分,使得兩個部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實現(xiàn)部分分離解耦,使他們可以獨立的變化。本文通過示例詳細介紹了橋接模式的原理與使用,需要的可以參考一下
    2022-06-06
  • Java線程池實現(xiàn)原理總結

    Java線程池實現(xiàn)原理總結

    這篇文章主要給大家分享的是Java線程池實現(xiàn)原理總結,線程池參數(shù)、線程池執(zhí)行流程等內容上總結,具有一定參考戒指,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-01-01
  • Java線程中的線程本地變量ThreadLocal詳解

    Java線程中的線程本地變量ThreadLocal詳解

    這篇文章主要介紹了Java線程中的線程本地變量ThreadLocal詳解,ThreadLocal存放的值是線程內共享的,線程間互斥的,主要用于線程內共享一些數(shù)據(jù),避免通過參數(shù)來傳遞,這樣處理后,能夠優(yōu)雅的解決一些實際問題,需要的朋友可以參考下
    2023-11-11
  • SpringBoot?MP簡單的分頁查詢測試實現(xiàn)步驟分解

    SpringBoot?MP簡單的分頁查詢測試實現(xiàn)步驟分解

    好久沒水后端的東西了,最近在做vue項目寫前端的代碼,所以cloud也停進度了,吃完飯突然記得我沒有在博客里寫分頁的東西,雖然項目中用到了,但是沒有拎出來,這里就拎出來看看
    2023-04-04
  • Java觀察者模式例子

    Java觀察者模式例子

    這篇文章主要介紹了Java觀察者模式例子的相關資料,需要的朋友可以參考下
    2015-12-12
  • java 使用idea將工程打成jar并創(chuàng)建成exe文件類型執(zhí)行的方法詳解

    java 使用idea將工程打成jar并創(chuàng)建成exe文件類型執(zhí)行的方法詳解

    這篇文章主要介紹了java 使用idea將工程打成jar并創(chuàng)建成exe文件類型執(zhí)行,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • 如何區(qū)分JAVA中的throws和throw

    如何區(qū)分JAVA中的throws和throw

    這篇文章主要介紹了如何區(qū)分JAVA中的throws和throw,文中講解十分詳細,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06

最新評論