国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringCloud微服務技術棧.黑馬跟學(一)

這篇具有很好參考價值的文章主要介紹了SpringCloud微服務技術棧.黑馬跟學(一)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

微服務技術棧導學

為什么學?

首先明白 SpringCloud != 微服務

應用場景:
? 找工作
面試必問微服務
企業(yè)開發(fā)也都使用微服務

? 降低成本
互聯(lián)網(wǎng)發(fā)展迅速,業(yè)務更新迭代快
微服務符合敏捷開發(fā)需求

? 激發(fā)程序員
架構師和操作人員受性能驅動,使用最好的工具來解決他們遇到的技術和業(yè)務問題

? 快速迭代
互聯(lián)網(wǎng)發(fā)展迅速,業(yè)務更新迭代快
微服務符合敏捷開發(fā)需求

學哪些?

核心思想是拆分,把大的業(yè)務模塊劃分成多個小的模塊,每個模塊叫服務。多個服務形成了服務集群。
服務集群多了之后,各個服務之間的調(diào)用關系會很復雜,需要靠注冊中心管理。
同理,隨著服務集群的增多,配置文件也不斷增長需要配置中心來管理(實現(xiàn)配置的熱更新)。
用戶訪問組件需要經(jīng)過網(wǎng)關,其作用主要是:身份驗證、路由規(guī)則、負載均衡。
把數(shù)據(jù)庫數(shù)據(jù)放入內(nèi)存中,為了應對高并發(fā),不能是單體緩存而是集群,稱為分布式緩存
進行搜索的時候用上分布式搜索。
最后還需要異步通信的消息隊列,為了減少服務通知的鏈路,縮短響應時間,增加吞吐量。
最后這么多組件,一旦出了問題,不好定位,引入分布式日志服務。
實時監(jiān)控系統(tǒng)中各個服務的狀態(tài)和內(nèi)存占用,可以定位到某個方法棧信息,便于找到異常所在稱為系統(tǒng)監(jiān)控鏈路追蹤。
SpringCloud微服務技術棧.黑馬跟學(一)
微笑服務的部署,只靠人工比較麻煩,我們引入Jenkins對微服務項目進行自動化編譯,用Docker進行打包和鏡像再基于kubernets或者RANCHER實現(xiàn)自動化的部署。這些就叫做持續(xù)集成。
SpringCloud微服務技術棧.黑馬跟學(一)

怎么學?

分層次教學
SpringCloud微服務技術棧.黑馬跟學(一)
學習路徑:

SpringCloud微服務技術棧.黑馬跟學(一)
每天任務
SpringCloud微服務技術棧.黑馬跟學(一)
今日學習目標:
SpringCloud微服務技術棧.黑馬跟學(一)

1.認識微服務

隨著互聯(lián)網(wǎng)行業(yè)的發(fā)展,對服務的要求也越來越高,服務架構也從單體架構逐漸演變?yōu)楝F(xiàn)在流行的微服務架構。這些架構之間有怎樣的差別呢?

1.1.學習目標

了解微服務架構的優(yōu)缺點

1.2.單體架構

單體架構:將業(yè)務的所有功能集中在一個項目中開發(fā),打成一個包部署。
SpringCloud微服務技術棧.黑馬跟學(一)
單體架構的優(yōu)缺點如下:
優(yōu)點:

  • 架構簡單
  • 部署成本低

缺點:

  • 耦合度高(維護困難、升級困難)

1.3.分布式架構

分布式架構:根據(jù)業(yè)務功能對系統(tǒng)做拆分,每個業(yè)務功能模塊作為獨立項目開發(fā),稱為一個服務。
SpringCloud微服務技術棧.黑馬跟學(一)
分布式架構的優(yōu)缺點:

優(yōu)點:

  • 降低服務耦合
  • 有利于服務升級和拓展

缺點:

  • 服務調(diào)用關系錯綜復雜

分布式架構雖然降低了服務耦合,但是服務拆分時也有很多問題需要思考:

  • 服務拆分的粒度如何界定?
  • 服務之間如何調(diào)用?
  • 服務的調(diào)用關系如何管理?

人們需要制定一套行之有效的標準來約束分布式架構。

1.4.微服務

微服務的架構特征:

  • 單一職責:微服務拆分粒度更小,每一個服務都對應唯一的業(yè)務能力,做到單一職責
  • 自治:團隊獨立、技術獨立、數(shù)據(jù)獨立,獨立部署和交付
  • 面向服務:服務提供統(tǒng)一標準的接口,與語言和技術無關
  • 隔離性強:服務調(diào)用做好隔離、容錯、降級,避免出現(xiàn)級聯(lián)問題
    SpringCloud微服務技術棧.黑馬跟學(一)
    微服務的上述特性其實是在給分布式架構制定一個標準,進一步降低服務之間的耦合度,提供服務的獨立性和靈活性。做到高內(nèi)聚,低耦合。

因此,可以認為微服務是一種經(jīng)過良好架構設計的分布式架構方案

但方案該怎么落地?選用什么樣的技術棧?全球的互聯(lián)網(wǎng)公司都在積極嘗試自己的微服務落地方案。

其中在Java領域最引人注目的就是SpringCloud提供的方案了。
微服務技術對比
SpringCloud微服務技術棧.黑馬跟學(一)
企業(yè)需求:以下4種技術選型
SpringCloud微服務技術棧.黑馬跟學(一)

1.5.SpringCloud

SpringCloud是目前國內(nèi)使用最廣泛的微服務框架。官網(wǎng)地址:SpringCloud官網(wǎng)。

SpringCloud集成了各種微服務功能組件,并基于SpringBoot實現(xiàn)了這些組件的自動裝配,從而提供了良好的開箱即用體驗。

其中常見的組件包括:
SpringCloud微服務技術棧.黑馬跟學(一)
另外,SpringCloud底層是依賴于SpringBoot的,并且有版本的兼容關系,如下:
SpringCloud微服務技術棧.黑馬跟學(一)
我們課堂學習的版本是 Hoxton.SR10,因此對應的SpringBoot版本是2.3.x版本。

1.6.總結

  • 單體架構:簡單方便,高度耦合,擴展性差,適合小型項目。例如:學生管理系統(tǒng)

  • 分布式架構:松耦合,擴展性好,但架構復雜,難度大。適合大型互聯(lián)網(wǎng)項目,例如:京東、淘寶

  • 微服務:一種良好的分布式架構方案
    ①優(yōu)點:拆分粒度更小、服務更獨立、耦合度更低
    ②缺點:架構非常復雜,運維、監(jiān)控、部署難度提高

  • SpringCloud是微服務架構的一站式解決方案,集成了各種優(yōu)秀微服務功能組件

2.服務拆分和遠程調(diào)用

任何分布式架構都離不開服務的拆分,微服務也是一樣。

2.1.服務拆分原則

這里我總結了微服務拆分時的幾個原則:

  • 不同微服務,不要重復開發(fā)相同業(yè)務
  • 微服務數(shù)據(jù)獨立,不要訪問其它微服務的數(shù)據(jù)庫
  • 微服務可以將自己的業(yè)務暴露為接口,供其它微服務調(diào)用
    SpringCloud微服務技術棧.黑馬跟學(一)

2.2.服務拆分示例

以課前資料中的微服務cloud-demo為例,其結構如下:
SpringCloud微服務技術棧.黑馬跟學(一)
cloud-demo:父工程,管理依賴

  • order-service:訂單微服務,負責訂單相關業(yè)務
  • user-service:用戶微服務,負責用戶相關業(yè)務

要求:

  • 訂單微服務和用戶微服務都必須有各自的數(shù)據(jù)庫,相互獨立
  • 訂單服務和用戶服務都對外暴露Restful的接口
  • 訂單服務如果需要查詢用戶信息,只能調(diào)用用戶服務的Restful接口,不能查詢用戶數(shù)據(jù)庫

2.2.1.導入Sql語句

首先,將課前資料提供的cloud-order.sqlcloud-user.sql導入到mysql中:
SpringCloud微服務技術棧.黑馬跟學(一)
cloud-user表中初始數(shù)據(jù)如下:
SpringCloud微服務技術棧.黑馬跟學(一)
cloud-order表中初始數(shù)據(jù)如下:
SpringCloud微服務技術棧.黑馬跟學(一)
cloud-order表中持有cloud-user表中的id字段。

2.2.2.導入demo工程

用IDEA導入課前資料提供的Demo:
SpringCloud微服務技術棧.黑馬跟學(一)
項目結構如下:
SpringCloud微服務技術棧.黑馬跟學(一)
導入后,會在IDEA右下角出現(xiàn)彈窗:
SpringCloud微服務技術棧.黑馬跟學(一)

點擊彈窗,然后按下圖選擇:
SpringCloud微服務技術棧.黑馬跟學(一)

會出現(xiàn)這樣的菜單:
SpringCloud微服務技術棧.黑馬跟學(一)

配置下項目使用的JDK:
SpringCloud微服務技術棧.黑馬跟學(一)

2.3.實現(xiàn)遠程調(diào)用案例

在order-service服務中,有一個根據(jù)id查詢訂單的接口:
SpringCloud微服務技術棧.黑馬跟學(一)
根據(jù)id查詢訂單,返回值是Order對象,如圖:

http://localhost:8080/order/101

SpringCloud微服務技術棧.黑馬跟學(一)
其中的user為null
在user-service中有一個根據(jù)id查詢用戶的接口:
SpringCloud微服務技術棧.黑馬跟學(一)
查詢的結果如圖:

http://localhost:8081/user/1

SpringCloud微服務技術棧.黑馬跟學(一)

2.3.1.案例需求:

修改order-service中的根據(jù)id查詢訂單業(yè)務,要求在查詢訂單的同時,根據(jù)訂單中包含的userId查詢出用戶信息,一起返回??梢钥吹侥壳笆沁@樣的:
SpringCloud微服務技術棧.黑馬跟學(一)

需求設計圖:
SpringCloud微服務技術棧.黑馬跟學(一)

因此,我們需要在order-service中 向user-service發(fā)起一個http的請求,調(diào)用http://localhost:8081/user/{userId}這個接口。

大概的步驟是這樣的:

  • 注冊一個RestTemplate的實例到Spring容器
  • 修改order-service服務中的OrderService類中的queryOrderById方法,根據(jù)Order對象中的userId查詢User
  • 將查詢的User填充到Order對象,一起返回

2.3.2.注冊RestTemplate

首先,我們在order-service服務中的OrderApplication啟動類中,注冊RestTemplate實例:

package cn.itcast.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

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

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

2.3.3.實現(xiàn)遠程調(diào)用

修改order-service服務中的cn.itcast.order.service包下的OrderService類中的queryOrderById方法:
SpringCloud微服務技術棧.黑馬跟學(一)

2.4.提供者與消費者

在服務調(diào)用關系中,會有兩個不同的角色:

服務提供者:一次業(yè)務中,被其它微服務調(diào)用的服務。(提供接口給其它微服務)
服務消費者:一次業(yè)務中,調(diào)用其它微服務的服務。(調(diào)用其它微服務提供的接口)
SpringCloud微服務技術棧.黑馬跟學(一)

但是,服務提供者與服務消費者的角色并不是絕對的,而是相對于業(yè)務而言。
如果服務A調(diào)用了服務B,而服務B又調(diào)用了服務C,服務B的角色是什么?

  • 對于A調(diào)用B的業(yè)務而言:A是服務消費者,B是服務提供者
  • 對于B調(diào)用C的業(yè)務而言:B是服務消費者,C是服務提供者

因此,服務B既可以是服務提供者,也可以是服務消費者

3.Eureka注冊中心

假如我們的服務提供者user-service部署了多個實例,如圖:
SpringCloud微服務技術棧.黑馬跟學(一)
大家思考幾個問題:

  • order-service在發(fā)起遠程調(diào)用的時候,該如何得知user-service實例的ip地址和端口?
  • 有多個user-service實例地址,order-service調(diào)用時該如何選擇?
  • order-service如何得知某個user-service實例是否依然健康,是不是已經(jīng)宕機?

3.1.Eureka的結構和作用

這些問題都需要利用SpringCloud中的注冊中心來解決,其中最廣為人知的注冊中心就是Eureka,其結構如下:
SpringCloud微服務技術棧.黑馬跟學(一)

回答之前的各個問題。

問題1:order-service如何得知user-service實例地址?

獲取地址信息的流程如下:

  • user-service服務實例啟動后,將自己的信息注冊到eureka-server(Eureka服務端)。這個叫服務注冊
  • eureka-server保存服務名稱到服務實例地址列表的映射關系。
  • order-service根據(jù)服務名稱,拉取實例地址列表。這個叫服務發(fā)現(xiàn)或服務拉取。

問題2:order-service如何從多個user-service實例中選擇具體的實例?

  • order-service從實例列表中利用負載均衡算法選中一個實例地址向該實例地址發(fā)起遠程調(diào)用。

問題3:order-service如何得知某個user-service實例是否依然健康,是不是已經(jīng)宕機?

  • user-service會每隔一段時間(默認30秒)向eureka-server發(fā)起請求,報告自己狀態(tài),稱為心跳當超過一定時間沒有發(fā)送心跳時,eureka-server會認為微服務實例故障,將該實例從服務列表中剔除order-service拉取服務時,就能將故障實例排除了。

注意:一個微服務,既可以是服務提供者,又可以是服務消費者,因此eureka將服務注冊、服務發(fā)現(xiàn)等功能統(tǒng)一封裝到了eureka-client端

因此,接下來我們動手實踐的步驟包括:

SpringCloud微服務技術棧.黑馬跟學(一)

3.2.搭建eureka-server

首先大家注冊中心服務端:eureka-server,這必須是一個獨立的微服務

3.2.1.創(chuàng)建eureka-server服務

在cloud-demo父工程下,創(chuàng)建一個子模塊:
SpringCloud微服務技術棧.黑馬跟學(一)

填寫模塊信息:
SpringCloud微服務技術棧.黑馬跟學(一)
然后填寫服務信息:

name:eureka-server

SpringCloud微服務技術棧.黑馬跟學(一)

3.2.2.引入eureka依賴

引入SpringCloud為eureka提供的starter依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

3.2.3.編寫啟動類

給eureka-server服務編寫一個啟動類,一定要添加一個@EnableEurekaServer注解,開啟eureka的注冊中心功能:

package cn.itcast.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

3.2.4.編寫配置文件

編寫一個application.yml文件,內(nèi)容如下:

server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka

3.2.5.啟動服務

啟動微服務,然后在瀏覽器訪問:http://127.0.0.1:10086
看到下面結果應該是成功了:
Status一欄,UP表示正常,DOWN表示宕機
SpringCloud微服務技術棧.黑馬跟學(一)

3.3.服務注冊

下面,我們將user-service注冊到eureka-server中去。

1)引入依賴

在user-service的pom文件中,引入下面的eureka-client依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2)配置文件

在user-service中,修改application.yml文件,添加服務名稱、eureka地址:

spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

3)啟動多個user-service實例

為了演示一個服務有多個實例的場景,我們添加一個SpringBoot的啟動配置,再啟動一個user-service。

? 首先,復制原來的user-service啟動配置:

SpringCloud微服務技術棧.黑馬跟學(一)
? 然后,在彈出的窗口中,填寫信息:

-Dserver.port=8082

SpringCloud微服務技術棧.黑馬跟學(一)

現(xiàn)在,SpringBoot窗口會出現(xiàn)兩個user-service啟動配置:
SpringCloud微服務技術棧.黑馬跟學(一)
不過,第一個是8081端口,第二個是8082端口。
啟動兩個user-service實例:
SpringCloud微服務技術棧.黑馬跟學(一)
查看eureka-server管理頁面:
SpringCloud微服務技術棧.黑馬跟學(一)

3.4.服務發(fā)現(xiàn)

下面,我們將order-service的邏輯修改:向eureka-server拉取user-service的信息,實現(xiàn)服務發(fā)現(xiàn)。

1)引入依賴

之前說過,服務發(fā)現(xiàn)、服務注冊統(tǒng)一都封裝在eureka-client依賴,因此這一步與服務注冊時一致。

在order-service的pom文件中,引入下面的eureka-client依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2)配置文件

服務發(fā)現(xiàn)也需要知道eureka地址,因此第二步與服務注冊一致,都是配置eureka信息:
在order-service中,修改application.yml文件,添加服務名稱、eureka地址:

spring:
  application:
    name: orderservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

登錄后看到4個服務都注冊了,并且能監(jiān)控到
SpringCloud微服務技術棧.黑馬跟學(一)

3)服務拉取和負載均衡

最后,我們要去eureka-server中拉取user-service服務的實例列表,并且實現(xiàn)負載均衡
不過這些動作不用我們?nèi)プ?,只需要添加一些注解即可?/p>

在order-service的OrderApplication中,給RestTemplate這個Bean添加一個@LoadBalanced注解:
SpringCloud微服務技術棧.黑馬跟學(一)

修改order-service服務中的cn.itcast.order.service包下的OrderService類中的queryOrderById方法。修改訪問的url路徑,用服務名代替ip、端口:
SpringCloud微服務技術棧.黑馬跟學(一)

spring會自動幫助我們從eureka-server端,根據(jù)userservice這個服務名稱,獲取實例列表,而后完成負載均衡。
最后我們連續(xù)2次訪問order

http://localhost:8080/order/102

http://localhost:8080/order/101

發(fā)現(xiàn)經(jīng)過負載均衡,user的2個服務器都進行了調(diào)用,有日志信息輸出。

4.Ribbon負載均衡

上一節(jié)中,我們添加了@LoadBalanced注解,即可實現(xiàn)負載均衡功能,這是什么原理呢?

4.1.負載均衡原理

SpringCloud底層其實是利用了一個名為Ribbon的組件,來實現(xiàn)負載均衡功能的。
SpringCloud微服務技術棧.黑馬跟學(一)
那么我們發(fā)出的請求明明是http://userservice/user/1,怎么變成了http://localhost:8081的呢?

4.2.源碼跟蹤

為什么我們只輸入了service名稱就可以訪問了呢?之前還要獲取ip和端口。
顯然有人幫我們根據(jù)service名稱,獲取到了服務實例的ip和端口。它就是LoadBalancerInterceptor,這個類會在對RestTemplate的請求進行攔截,然后從Eureka根據(jù)服務id獲取服務列表,隨后利用負載均衡算法得到真實的服務地址信息,替換服務id。

我們進行源碼跟蹤:

1)LoadBalancerIntercepor

SpringCloud微服務技術棧.黑馬跟學(一)

可以看到這里的intercept方法,攔截了用戶的HttpRequest請求,然后做了幾件事:

  • request.getURI():獲取請求uri,本例中就是 http://user-service/user/8
  • originalUri.getHost():獲取uri路徑的主機名,其實就是服務id,user-service
  • this.loadBalancer.execute():處理服務id,和用戶請求。

這里的this.loadBalancerLoadBalancerClient類型,我們繼續(xù)跟入。

2)LoadBalancerClient

繼續(xù)跟入execute方法:
SpringCloud微服務技術棧.黑馬跟學(一)
代碼是這樣的:

? getLoadBalancer(serviceId):根據(jù)服務id獲取ILoadBalancer,而ILoadBalancer會拿著服務id去eureka中獲取服務列表并保存起來。

? getServer(loadBalancer):利用內(nèi)置的負載均衡算法,從服務列表中選擇一個。本例中,可以看到獲取了8082端口的服務

放行后,再次訪問并跟蹤,發(fā)現(xiàn)獲取的是8081:

SpringCloud微服務技術棧.黑馬跟學(一)
果然實現(xiàn)了負載均衡。

3)負載均衡策略IRule

在剛才的代碼中,可以看到獲取服務使通過一個getServer方法來做負載均衡:
SpringCloud微服務技術棧.黑馬跟學(一)

我們繼續(xù)跟入:

SpringCloud微服務技術棧.黑馬跟學(一)

繼續(xù)跟蹤源碼chooseServer方法,發(fā)現(xiàn)這么一段代碼:
SpringCloud微服務技術棧.黑馬跟學(一)

我們看看這個rule是誰:
SpringCloud微服務技術棧.黑馬跟學(一)

這里的rule默認值是一個RoundRobinRule,看類的介紹:

SpringCloud微服務技術棧.黑馬跟學(一)

這不就是輪詢的意思嘛。

到這里,整個負載均衡的流程我們就清楚了。

4)總結

SpringCloudRibbon的底層采用了一個攔截器,攔截了RestTemplate發(fā)出的請求,對地址做了修改。用一幅圖來總結一下:

SpringCloud微服務技術棧.黑馬跟學(一)

基本流程如下:

  • 攔截我們的RestTemplate請求http://userservice/user/1
  • RibbonLoadBalancerClient會從請求url中獲取服務名稱,也就是user-service
  • DynamicServerListLoadBalancer根據(jù)user-service到eureka拉取服務列表
  • eureka返回列表,localhost:8081、localhost:8082
  • IRule利用內(nèi)置負載均衡規(guī)則,從列表中選擇一個,例如localhost:8081
  • RibbonLoadBalancerClient修改請求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,發(fā)起真實請求。

4.3.負載均衡策略

4.3.1.負載均衡策略

負載均衡的規(guī)則都定義在IRule接口中,而IRule有很多不同的實現(xiàn)類:
SpringCloud微服務技術棧.黑馬跟學(一)
不同規(guī)則的含義如下:

內(nèi)置負載均衡規(guī)則類 規(guī)則描述
RoundRobinRule 簡單輪詢服務列表來選擇服務器。它是Ribbon默認的負載均衡規(guī)則。
AvailabilityFilteringRule 對以下兩種服務器進行忽略: (1)在默認情況下,這臺服務器如果3次連接失敗,這臺服務器就會被設置為“短路”狀態(tài)。短路狀態(tài)將持續(xù)30秒,如果再次連接失敗,短路的持續(xù)時間就會幾何級地增加。 (2)并發(fā)數(shù)過高的服務器。如果一個服務器的并發(fā)連接數(shù)過高,配置了AvailabilityFilteringRule規(guī)則的客戶端也會將其忽略。并發(fā)連接數(shù)的上限,可以由客戶端的< clientName >.< clientConfigNameSpace >.ActiveConnectionsLimit屬性進行配置。
WeightedResponseTimeRule 為每一個服務器賦予一個權重值。服務器響應時間越長,這個服務器的權重就越小。這個規(guī)則會隨機選擇服務器,這個權重值會影響服務器的選擇。
ZoneAvoidanceRule 以區(qū)域可用的服務器為基礎進行服務器的選擇。使用Zone對服務器進行分類,這個Zone可以理解為一個機房、一個機架等。而后再對Zone內(nèi)的多個服務做輪詢。
BestAvailableRule 忽略那些短路的服務器,并選擇并發(fā)數(shù)較低的服務器。
RandomRule 隨機選擇一個可用的服務器。
RetryRule 重試機制的選擇邏輯

默認的實現(xiàn)就是ZoneAvoidanceRule,是一種輪詢方案

4.3.2.自定義負載均衡策略

通過定義IRule實現(xiàn)可以修改負載均衡規(guī)則,有兩種方式:

  1. 代碼方式:在order-service中的OrderApplication類中,定義一個新的IRule:
@Bean
public IRule randomRule(){
    return new RandomRule();
}
  1. 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改規(guī)則:
userservice: # 給某個微服務配置負載均衡規(guī)則,這里是userservice服務
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負載均衡規(guī)則 

注意,一般用默認的負載均衡規(guī)則,不做修改。

4.4.饑餓加載

我們重啟order-service,訪問

http://localhost:8080/order/101

發(fā)現(xiàn)耗時700多ms
SpringCloud微服務技術棧.黑馬跟學(一)

我們刷新一下發(fā)現(xiàn)耗時明顯減少了
SpringCloud微服務技術棧.黑馬跟學(一)

為什么第一次耗時這么長,之后就明顯減少了呢?

Ribbon默認是采用懶加載,即第一次訪問時才會去創(chuàng)建LoadBalanceClient,請求時間會很長。

那我們想降低第一次訪問的耗時該怎么辦呢?

而饑餓加載則會在項目啟動時創(chuàng)建,降低第一次訪問的耗時,通過下面配置開啟饑餓加載:
SpringCloud微服務技術棧.黑馬跟學(一)

ribbon:
  eager-load:
    enabled: true
    clients: userservice
      # 多個需要用-分割、換行
      # -userservice1
      # -userservice2

我們重啟OrderApplication然后看一下首次加載的速度
控制臺明顯看到加載的時候,就把8081和8082端口進行了創(chuàng)建
SpringCloud微服務技術棧.黑馬跟學(一)
訪問時間相比700多ms也減少了,沒減很多是還有dispatcherservlet的加載
SpringCloud微服務技術棧.黑馬跟學(一)

5.Nacos注冊中心

國內(nèi)公司一般都推崇阿里巴巴的技術,比如注冊中心,SpringCloudAlibaba也推出了一個名為Nacos的注冊中心。

5.1.認識和安裝Nacos

Nacos是阿里巴巴的產(chǎn)品,現(xiàn)在是SpringCloud中的一個組件。相比Eureka功能更加豐富,在國內(nèi)受歡迎程度較高。
SpringCloud微服務技術棧.黑馬跟學(一)

安裝方式如下:

5.1.1 Nacos安裝指南

1.Windows安裝

開發(fā)階段采用單機安裝即可。

1.1.下載安裝包

在Nacos的GitHub頁面,提供有下載鏈接,可以下載編譯好的Nacos服務端或者源代碼:

GitHub主頁:Nacos官網(wǎng)

GitHub的Release下載頁:Nacos下載頁

如圖:
SpringCloud微服務技術棧.黑馬跟學(一)
本課程采用1.4.1.版本的Nacos,課前資料已經(jīng)準備了安裝包:
SpringCloud微服務技術棧.黑馬跟學(一)

windows版本使用nacos-server-1.4.1.zip包即可。

1.2.解壓

將這個包解壓到任意非中文目錄下,如圖:
SpringCloud微服務技術棧.黑馬跟學(一)

目錄說明:

  • bin:啟動腳本
  • conf:配置文件
1.3.端口配置

Nacos的默認端口是8848,如果你電腦上的其它進程占用了8848端口,請先嘗試關閉該進程。

如果無法關閉占用8848端口的進程,也可以進入nacos的conf目錄,修改配置文件中的端口:
SpringCloud微服務技術棧.黑馬跟學(一)

修改其中的內(nèi)容:
SpringCloud微服務技術棧.黑馬跟學(一)

1.4.啟動

啟動非常簡單,進入bin目錄,結構如下:
SpringCloud微服務技術棧.黑馬跟學(一)

然后執(zhí)行命令即可:

  • windows命令:
./startup.cmd -m standalone

執(zhí)行后的效果如圖:

SpringCloud微服務技術棧.黑馬跟學(一)

1.5.訪問

在瀏覽器輸入地址:http://127.0.0.1:8848/nacos即可:

SpringCloud微服務技術棧.黑馬跟學(一)

默認的賬號和密碼都是nacos,進入后:
SpringCloud微服務技術棧.黑馬跟學(一)

2.Linux安裝

Linux或者Mac安裝方式與Windows類似。

2.1.安裝JDK

Nacos依賴于JDK運行,所以Linux上也需要安裝JDK才行。

上傳jdk安裝包:
SpringCloud微服務技術棧.黑馬跟學(一)
上傳到某個目錄,例如:/usr/local/

然后解壓縮:

tar -xvf jdk-8u144-linux-x64.tar.gz

然后重命名為java

配置環(huán)境變量:

export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin

設置環(huán)境變量:

source /etc/profile
2.2.上傳安裝包

如圖:
SpringCloud微服務技術棧.黑馬跟學(一)

也可以直接使用課前資料中的tar.gz:
SpringCloud微服務技術棧.黑馬跟學(一)
上傳到Linux服務器的某個目錄,例如/usr/local/src目錄下:
SpringCloud微服務技術棧.黑馬跟學(一)

2.3.解壓

命令解壓縮安裝包:

tar -zxvf nacos-server-1.4.1.tar.gz

然后刪除安裝包:

rm -rf nacos-server-1.4.1.tar.gz

目錄中最終樣式:
SpringCloud微服務技術棧.黑馬跟學(一)

目錄內(nèi)部:
SpringCloud微服務技術棧.黑馬跟學(一)

2.4.端口配置

與windows中類似

2.5.啟動

在nacos/bin目錄中,輸入命令啟動Nacos:

sh startup.sh -m standalone
3.Nacos的依賴

父工程:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

客戶端:

<!-- nacos客戶端依賴包 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

5.2.服務注冊到nacos

Nacos是SpringCloudAlibaba的組件,而SpringCloudAlibaba也遵循SpringCloud中定義的服務注冊、服務發(fā)現(xiàn)規(guī)范。因此使用Nacos和使用Eureka對于微服務來說,并沒有太大區(qū)別。

主要差異在于:

  • 依賴不同
  • 服務地址不同

1)引入依賴

在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依賴:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

然后在user-service和order-service中的pom文件中引入nacos-discovery依賴:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

注意:不要忘了注釋掉eureka的依賴。

2)配置nacos地址

在user-service和order-service的application.yml中添加nacos地址:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848

注意:不要忘了注釋掉eureka的地址

3)重啟

重啟微服務后,登錄nacos管理頁面,可以看到微服務信息:
SpringCloud微服務技術棧.黑馬跟學(一)

5.3.服務分級存儲模型

一個服務可以有多個實例,例如我們的user-service,可以有:

  • 127.0.0.1:8081
  • 127.0.0.1:8082
  • 127.0.0.1:8083

假如這些實例分布于全國各地的不同機房,例如:

  • 127.0.0.1:8081,在上海機房
  • 127.0.0.1:8082,在上海機房
  • 127.0.0.1:8083,在杭州機房

Nacos就將同一機房內(nèi)的實例 劃分為一個集群。

也就是說,user-service是服務,一個服務可以包含多個集群,如杭州、上海,每個集群下可以有多個實例,形成分級模型,如圖:
SpringCloud微服務技術棧.黑馬跟學(一)

微服務互相訪問時,應該盡可能訪問同集群實例,因為本地訪問速度更快。當本集群內(nèi)不可用時,才訪問其它集群。例如:
SpringCloud微服務技術棧.黑馬跟學(一)

杭州機房內(nèi)的order-service應該優(yōu)先訪問同機房的user-service。

5.3.1.給user-service配置集群

目前看我們的項目中是沒有集群的
SpringCloud微服務技術棧.黑馬跟學(一)

修改user-service的application.yml文件,添加集群配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名稱

重啟兩個user-service實例后,我們可以在nacos控制臺看到下面結果:
SpringCloud微服務技術棧.黑馬跟學(一)

我們再次復制一個user-service啟動配置,添加屬性:

-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH

配置如圖所示:
SpringCloud微服務技術棧.黑馬跟學(一)
這一步也可以更改user-service中的application.yml文件

  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服務地址
      discovery:
        cluster-name: SH #上海 名字可以自定義,集群名稱

啟動UserApplication3后再次查看nacos控制臺:
SpringCloud微服務技術棧.黑馬跟學(一)

5.3.2.同集群優(yōu)先的負載均衡

默認的ZoneAvoidanceRule并不能實現(xiàn)根據(jù)同集群優(yōu)先來實現(xiàn)負載均衡。
因此Nacos中提供了一個NacosRule的實現(xiàn),可以優(yōu)先從同集群中挑選實例。
1)給order-service配置集群信息
修改order-service的application.yml文件,添加集群配置:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ # 集群名稱

這個時候看到order-service在nacos中是HZ集群
SpringCloud微服務技術棧.黑馬跟學(一)
現(xiàn)在我們多次訪問,發(fā)現(xiàn)還是輪詢調(diào)用
8081
SpringCloud微服務技術棧.黑馬跟學(一)
8082
SpringCloud微服務技術棧.黑馬跟學(一)

8083
SpringCloud微服務技術棧.黑馬跟學(一)

2)修改負載均衡規(guī)則

修改order-service的application.yml文件,修改負載均衡規(guī)則:

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡規(guī)則 

修改后我們訪問

http://localhost:8080/order/101
http://localhost:8080/order/102
http://localhost:8080/order/103
http://localhost:8080/order/104
http://localhost:8080/order/105

發(fā)現(xiàn)8083也就是SH集群里什么日志信息都沒有
SpringCloud微服務技術棧.黑馬跟學(一)
而8081和8082HZ集群中是隨機負載均衡,這說明會優(yōu)先調(diào)用本地集群,在本地集群的多個實例中,使用隨機。

那我們把8081和8082 HZ集群都停了,再調(diào)用會發(fā)生什么呢?
SpringCloud微服務技術棧.黑馬跟學(一)
訪問

http://localhost:8080/order/101

可以發(fā)現(xiàn)訪問成功
SpringCloud微服務技術棧.黑馬跟學(一)
userservice日志
SpringCloud微服務技術棧.黑馬跟學(一)

orderservice日志:警告有跨集群的訪問出現(xiàn)
SpringCloud微服務技術棧.黑馬跟學(一)

5.4.權重配置

實際部署中會出現(xiàn)這樣的場景:
? 服務器設備性能有差異,部分實例所在機器性能較好,另一些較差,我們希望性能好的機器承擔更多的用戶請求。

但默認情況下NacosRule是同集群內(nèi)隨機挑選,不會考慮機器的性能問題。

因此,Nacos提供了權重配置來控制訪問頻率,權重越大則訪問頻率越高。

在nacos控制臺,找到user-service的實例列表,點擊編輯,即可修改權重:
SpringCloud微服務技術棧.黑馬跟學(一)
在彈出的編輯窗口,修改權重:注意權重的值是0 ~ 1之間,性能好的機器配的權重高,性能差的機器配置的權重低。
SpringCloud微服務技術棧.黑馬跟學(一)

多次訪問

http://localhost:8080/order/105

可以明顯看到后臺日志中userApplication中。寥寥無幾
SpringCloud微服務技術棧.黑馬跟學(一)
userApplication2中,非常多
SpringCloud微服務技術棧.黑馬跟學(一)
注意:如果權重修改為0,則該實例永遠不會被訪問
權重為0通常用于系統(tǒng)升級。
先將某個服務器的權重設置為0,然后做升級,升級完后,把權重調(diào)小,放一部分用戶進來,無問題,再把權重擴大。(平滑升級)

5.5.環(huán)境隔離

Nacos提供了namespace來實現(xiàn)環(huán)境隔離功能。

  • nacos中可以有多個namespace
  • namespace下可以有group、service等
  • 不同namespace之間相互隔離,例如不同namespace的服務互相不可見

上面已經(jīng)按照服務、集群、實例進行劃分了,這里為什么還要提出環(huán)境隔離的概念呢?

答:上面的劃分是按照地域或者業(yè)務所在區(qū)域劃分推出的,這里namespace針對開發(fā)人員解決開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境切換等。

SpringCloud微服務技術棧.黑馬跟學(一)

5.5.1.創(chuàng)建namespace

默認情況下,所有service、data、group都在同一個namespace,名為public:

SpringCloud微服務技術棧.黑馬跟學(一)

我們可以點擊頁面新增按鈕,添加一個namespace:
SpringCloud微服務技術棧.黑馬跟學(一)

然后,填寫表單:
SpringCloud微服務技術棧.黑馬跟學(一)

就能在頁面看到一個新的namespace:
SpringCloud微服務技術棧.黑馬跟學(一)

5.5.2.給微服務配置namespace

給微服務配置namespace只能通過修改配置來實現(xiàn)。

例如,修改order-service的application.yml文件:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空間,填ID

重啟order-service后,訪問控制臺,可以看到下面的結果:
SpringCloud微服務技術棧.黑馬跟學(一)

SpringCloud微服務技術棧.黑馬跟學(一)

此時訪問order-service,因為namespace不同,會導致找不到userservice,控制臺會報錯:
SpringCloud微服務技術棧.黑馬跟學(一)

5.6.Nacos與Eureka的區(qū)別

Nacos的服務實例分為兩種l類型:

  • 臨時實例:如果實例宕機超過一定時間,會從服務列表剔除,默認的類型。

  • 非臨時實例:如果實例宕機,不會從服務列表剔除,也可以叫永久實例。

默認情況下,所有實例都是臨時實例
SpringCloud微服務技術棧.黑馬跟學(一)
臨時實例,每隔30秒會向Nacos發(fā)送心跳,靠Nacos進行監(jiān)控,一旦發(fā)現(xiàn)超時未發(fā)送心跳,就會被Nacos從服務列表中移除。
非臨時實例,不會發(fā)送心跳,是Nacos主動向provider進行詢問。如果詢問超時也不會剔除服務列表,而是僅僅標記為不健康,等待其恢復健康即可。

配置一個服務實例為永久實例:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 設置為非臨時實例

配置完后,我們看Nacos
SpringCloud微服務技術棧.黑馬跟學(一)
我們把oderservice服務停掉,看到Nacos控制臺,只是把它標記為了不健康
SpringCloud微服務技術棧.黑馬跟學(一)

Nacos和Eureka整體結構類似,服務注冊、服務拉取、心跳等待,但是也存在一些差異:
SpringCloud微服務技術棧.黑馬跟學(一)

  • Nacos與eureka的共同點

    • 都支持服務注冊和服務拉取
    • 都支持服務提供者心跳方式做健康檢測
  • Nacos與Eureka的區(qū)別文章來源地址http://www.zghlxwxcb.cn/news/detail-403828.html

    • Nacos支持服務端主動檢測提供者狀態(tài):臨時實例采用心跳模式,非臨時實例采用主動檢測模式
    • 臨時實例心跳不正常會被剔除,非臨時實例則不會被剔除
    • Nacos支持服務列表變更的消息推送模式,服務列表更新更及時
    • Nacos集群默認采用AP方式(強調(diào)服務可用性),當集群中存在非臨時實例時,采用CP模式(可靠性和一致性);Eureka采用AP方式。

到了這里,關于SpringCloud微服務技術棧.黑馬跟學(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • MongoDB快速上手.黑馬跟學(一)

    MongoDB快速上手.黑馬跟學(一)

    MongoDB用起來 - 快速上手集群和安全系列 理解MongoDB的業(yè)務場景、熟悉MongoDB的簡介、特點和體系結構、數(shù)據(jù)類型等。 能夠在Windows和Linux下安裝和啟動MongoDB、圖形化管理界面Compass的安裝使用 掌握MongoDB基本常用命令實現(xiàn)數(shù)據(jù)的CRUD 掌握MongoDB的索引類型、索引管理、執(zhí)行計劃。

    2023年04月08日
    瀏覽(75)
  • Git全套教程一套精通git.跟學黑馬筆記

    Git全套教程一套精通git.跟學黑馬筆記

    我在大學畢業(yè)寫論文的時候的時候碰到過如下的現(xiàn)象 類似的問題我曾經(jīng)也碰到過很多,例如: 實際上,代碼開發(fā)中也需要這樣的軟件來管理我們的代碼. 例如我們經(jīng)常會碰到如下的現(xiàn)象: 在這種情況下如果不能查看修改之前的代碼,查找問題是非常困難的. 如果有一個軟件能記錄我

    2024年03月26日
    瀏覽(25)
  • 《黑馬頭條》SpringBoot+SpringCloud+ Nacos等企業(yè)級微服務架構項目

    《黑馬頭條》SpringBoot+SpringCloud+ Nacos等企業(yè)級微服務架構項目

    各位爺,完整項目gitee如下,求star heima-leadnews-master: 《黑馬頭條》項目采用的是SpringBoot+springcloud當下最流行的微服務為項目架構,配合spring cloud alibaba nacos作為項目的注冊和配置中心。新課程采用快速開發(fā)的模式,主要解決真實企業(yè)開發(fā)的一些應用場景。詳情請看博客:htt

    2024年02月15日
    瀏覽(30)
  • 黑馬頭條 SpringBoot+SpringCloud+ Nacos等企業(yè)級微服務架構項目

    黑馬頭條 SpringBoot+SpringCloud+ Nacos等企業(yè)級微服務架構項目

    各位爺,完整項目gitee如下,求star heima-leadnews-master: 《黑馬頭條》項目采用的是SpringBoot+springcloud當下最流行的微服務為項目架構,配合spring cloud alibaba nacos作為項目的注冊和配置中心。新課程采用快速開發(fā)的模式,主要解決真實企業(yè)開發(fā)的一些應用場景。詳情請看博客:htt

    2024年02月08日
    瀏覽(27)
  • 微服務技術筆記-黑馬(1、基礎1)

    微服務技術筆記-黑馬(1、基礎1)

    微服務(Microservices) 是一種軟件架構風格,它是以專注于單一責任與功能的小型功能區(qū)塊 (Small Building Blocks) 為基礎,利用模組化的方式組合出復雜的大型應用程序,各功能區(qū)塊使用與語言無關 (Language-Independent/Language agnostic) 的 API 集相互通訊。 單體架構 : 將業(yè)務的所有功能集

    2024年02月07日
    瀏覽(14)
  • 詳解SpringCloud微服務技術棧:認識微服務、服務拆分與遠程調(diào)用

    詳解SpringCloud微服務技術棧:認識微服務、服務拆分與遠程調(diào)用

    ?????作者簡介:一位大四、研0學生,正在努力準備大四暑假的實習 ??上期文章:首期文章 ??訂閱專欄:微服務技術全家桶 希望文章對你們有所幫助 在此之前,耗時半個月,我已經(jīng)將Redis進行了一個原理上的速成以及項目的制作,整個項目我覺得還是很不錯的,基本已

    2024年01月18日
    瀏覽(23)
  • 【SpringCloud】微服務技術棧入門3 - Gateway快速上手

    【SpringCloud】微服務技術棧入門3 - Gateway快速上手

    WebFlux gateway 基于 webflux 構建 WebFlux 是基于反應式流概念的響應式編程框架,用于構建異步非阻塞的 Web 應用程序。它支持響應式編程范式,并提供了一種響應式的方式來處理 Web 請求。 與傳統(tǒng)的 Servlet API 相比,WebFlux 采用了基于事件驅動的編程模型,不依賴于傳統(tǒng)的線程池模

    2024年02月07日
    瀏覽(56)
  • SpringCloud微服務技術棧的注冊中心Eureka

    在微服務架構中,服務的數(shù)量龐大,而且每個服務可能會有多個實例。此時,需要一個中心化的地方來管理和維護各個服務的相關信息,這就是微服務治理中很重要的一環(huán):服務注冊與發(fā)現(xiàn)。其中,服務注冊是指將提供服務的應用實例注冊到注冊中心,而服務發(fā)現(xiàn)則是指從注

    2023年04月09日
    瀏覽(18)
  • SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系統(tǒng)詳解springcloud微服務技術棧

    SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系統(tǒng)詳解springcloud微服務技術棧

    我們發(fā)現(xiàn)在微服務中有一個令人頭疼的問題——部署,用Docker去解決這個部署難題 1、項目部署的問題 2、Docker 扔到一臺機器上,它們的依賴難道沒有干擾嗎?不會,docker將打包好的程序放到一個隔離容器去運行,使用沙箱機制,避免互相干擾,之間不可見,這樣就解決了混

    2023年04月24日
    瀏覽(18)
  • 分布式微服務技術棧-SpringCloud<Eureka,Ribbon,nacos>

    分布式微服務技術棧-SpringCloud<Eureka,Ribbon,nacos>

    分布式架構的一種 把服務進行 拆分 springcloud 解決了 服務拆分過程中的 治理問題 與單體應用 進行區(qū)分 (單體架構 把業(yè)務所有功能集中開發(fā),打成一個包部署) 每個模塊獨立開發(fā)和部署(服務集群) 服務之間互相調(diào)用 出現(xiàn)分布式技術 Webservice ESB Hession Dubbo 異步通信 消息隊

    2024年02月07日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包