中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

做網(wǎng)站培訓(xùn)商品推廣軟文范例100字

做網(wǎng)站培訓(xùn),商品推廣軟文范例100字,網(wǎng)站數(shù)據(jù)庫連接錯誤,鮮花網(wǎng)站建設(shè)源代碼SpringCloud01 1.認(rèn)識微服務(wù) 隨著互聯(lián)網(wǎng)行業(yè)的發(fā)展,對服務(wù)的要求也越來越高,服務(wù)架構(gòu)也從單體架構(gòu)逐漸演變?yōu)楝F(xiàn)在流行的微服務(wù)架構(gòu)。這些架構(gòu)之間有怎樣的差別呢? 1.0.學(xué)習(xí)目標(biāo) 了解微服務(wù)架構(gòu)的優(yōu)缺點 1.1.單體架構(gòu) 單體架構(gòu)&#xff…

SpringCloud01

1.認(rèn)識微服務(wù)

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

1.0.學(xué)習(xí)目標(biāo)

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

1.1.單體架構(gòu)

單體架構(gòu):將業(yè)務(wù)的所有功能集中在一個項目中開發(fā),打成一個包部署。

在這里插入圖片描述

單體架構(gòu)的優(yōu)缺點如下:

優(yōu)點:

  • 架構(gòu)簡單
  • 部署成本低

缺點:

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

1.2.分布式架構(gòu)

分布式架構(gòu):根據(jù)業(yè)務(wù)功能對系統(tǒng)做拆分,每個業(yè)務(wù)功能模塊作為獨立項目開發(fā),稱為一個服務(wù)。

在這里插入圖片描述

分布式架構(gòu)的優(yōu)缺點:

優(yōu)點:

  • 降低服務(wù)耦合
  • 有利于服務(wù)升級和拓展

缺點:

  • 服務(wù)調(diào)用關(guān)系錯綜復(fù)雜

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

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

人們需要制定一套行之有效的標(biāo)準(zhǔn)來約束分布式架構(gòu)。

1.3.微服務(wù)

微服務(wù)的架構(gòu)特征:

  • 單一職責(zé):微服務(wù)拆分粒度更小,每一個服務(wù)都對應(yīng)唯一的業(yè)務(wù)能力,做到單一職責(zé)
  • 自治:團隊獨立、技術(shù)獨立、數(shù)據(jù)獨立,獨立部署和交付
  • 面向服務(wù):服務(wù)提供統(tǒng)一標(biāo)準(zhǔn)的接口,與語言和技術(shù)無關(guān)
  • 隔離性強:服務(wù)調(diào)用做好隔離、容錯、降級,避免出現(xiàn)級聯(lián)問題

在這里插入圖片描述

微服務(wù)的上述特性其實是在給分布式架構(gòu)制定一個標(biāo)準(zhǔn),進一步降低服務(wù)之間的耦合度,提供服務(wù)的獨立性和靈活性。做到高內(nèi)聚,低耦合。

因此,可以認(rèn)為微服務(wù)是一種經(jīng)過良好架構(gòu)設(shè)計的分布式架構(gòu)方案 。

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

其中在Java領(lǐng)域最引人注目的就是SpringCloud提供的方案了。

1.4.SpringCloud

SpringCloud是目前國內(nèi)使用最廣泛的微服務(wù)框架。官網(wǎng)地址:https://spring.io/projects/spring-cloud。

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

其中常見的組件包括:

在這里插入圖片描述

另外,SpringCloud底層是依賴于SpringBoot的,并且有版本的兼容關(guān)系,如下:

在這里插入圖片描述

我們課堂學(xué)習(xí)的版本是 Hoxton.SR10,因此對應(yīng)的SpringBoot版本是2.3.x版本。

1.5.總結(jié)

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

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

  • 微服務(wù):一種良好的分布式架構(gòu)方案

    ①優(yōu)點:拆分粒度更小、服務(wù)更獨立、耦合度更低

    ②缺點:架構(gòu)非常復(fù)雜,運維、監(jiān)控、部署難度提高

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

2.服務(wù)拆分和遠(yuǎn)程調(diào)用

任何分布式架構(gòu)都離不開服務(wù)的拆分,微服務(wù)也是一樣。

2.1.服務(wù)拆分原則

這里我總結(jié)了微服務(wù)拆分時的幾個原則:

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

在這里插入圖片描述

2.2.服務(wù)拆分示例

以課前資料中的微服務(wù)cloud-demo為例,其結(jié)構(gòu)如下:

在這里插入圖片描述

cloud-demo:父工程,管理依賴

  • order-service:訂單微服務(wù),負(fù)責(zé)訂單相關(guān)業(yè)務(wù)
  • user-service:用戶微服務(wù),負(fù)責(zé)用戶相關(guān)業(yè)務(wù)

要求:

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

2.2.1.導(dǎo)入Sql語句

分別在mysql中創(chuàng)建 cloud_order訂單庫 cloud_user 用戶庫,并將課前資料提供的cloud-order.sqlcloud-user.sql導(dǎo)入到mysql中:

在這里插入圖片描述

cloud-user表中初始數(shù)據(jù)如下:

在這里插入圖片描述

cloud-order表中初始數(shù)據(jù)如下:

在這里插入圖片描述

cloud-order表中持有cloud-user表中的id字段。

2.2.2.導(dǎo)入demo工程

用IDEA導(dǎo)入課前資料提供的Demo:

在這里插入圖片描述

項目結(jié)構(gòu)如下:

在這里插入圖片描述

導(dǎo)入后,會在IDEA右下角出現(xiàn)彈窗:

在這里插入圖片描述

點擊彈窗,然后按下圖選擇:

在這里插入圖片描述

會出現(xiàn)這樣的菜單:

在這里插入圖片描述

配置下項目使用的JDK:

在這里插入圖片描述

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

在order-service服務(wù)中,有一個根據(jù)id查詢訂單的接口:

在這里插入圖片描述

根據(jù)id查詢訂單,返回值是Order對象,如圖:

在這里插入圖片描述

其中的user為null

在user-service中有一個根據(jù)id查詢用戶的接口:

在這里插入圖片描述

查詢的結(jié)果如圖:

在這里插入圖片描述

2.3.1.案例需求:

修改order-service中的根據(jù)id查詢訂單業(yè)務(wù),要求在查詢訂單的同時,根據(jù)訂單中包含的userId查詢出用戶信息,一起返回。

在這里插入圖片描述

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

大概的步驟是這樣的:

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

2.3.2.注冊RestTemplate

首先,我們在order-service服務(wù)中的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);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

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

修改order-service服務(wù)中的cn.itcast.order.service包下的OrderService類中的queryOrderById方法:

在這里插入圖片描述

2.4.提供者與消費者

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

服務(wù)提供者:一次業(yè)務(wù)中,被其它微服務(wù)調(diào)用的服務(wù)。(提供接口給其它微服務(wù))

服務(wù)消費者:一次業(yè)務(wù)中,調(diào)用其它微服務(wù)的服務(wù)。(調(diào)用其它微服務(wù)提供的接口)

在這里插入圖片描述

但是,服務(wù)提供者與服務(wù)消費者的角色并不是絕對的,而是相對于業(yè)務(wù)而言。

如果服務(wù)A調(diào)用了服務(wù)B,而服務(wù)B又調(diào)用了服務(wù)C,服務(wù)B的角色是什么?

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

因此,服務(wù)B既可以是服務(wù)提供者,也可以是服務(wù)消費者。

3.Eureka注冊中心

假如我們的服務(wù)提供者user-service部署了多個實例,如圖:

在這里插入圖片描述

大家思考幾個問題:

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

3.1.Eureka的結(jié)構(gòu)和作用

這些問題都需要利用SpringCloud中的注冊中心來解決,其中最廣為人知的注冊中心就是Eureka,其結(jié)構(gòu)如下:

在這里插入圖片描述

回答之前的各個問題。

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

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

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

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

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

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

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

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

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

在這里插入圖片描述

3.2.搭建eureka-server

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

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

在cloud-demo父工程下,創(chuàng)建一個子模塊:

在這里插入圖片描述

填寫模塊信息:

在這里插入圖片描述

然后填寫服務(wù)信息:

在這里插入圖片描述

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服務(wù)編寫一個啟動類,一定要添加一個@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/eurekaregister-with-eureka: false # false表示不向注冊中心注冊自己。fetch-registry: false # false表示自己端就是注冊中心,我的職責(zé)就是維護服務(wù)實例,并不需要去檢索服務(wù)      

3.2.5.啟動服務(wù)

啟動微服務(wù),然后在瀏覽器訪問:http://127.0.0.1:10086

看到下面結(jié)果應(yīng)該是成功了:

在這里插入圖片描述

3.3.服務(wù)注冊

下面,我們將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文件,添加服務(wù)名稱、eureka地址:

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

3)啟動多個user-service實例

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

首先,復(fù)制原來的user-service啟動配置:

在這里插入圖片描述

在這里插入圖片描述

然后,在彈出的窗口中,填寫信息:

在這里插入圖片描述

現(xiàn)在,SpringBoot窗口會出現(xiàn)兩個user-service啟動配置:

在這里插入圖片描述

不過,第一個是8081端口,第二個是8082端口。

啟動兩個user-service實例:

在這里插入圖片描述

查看eureka-server管理頁面:

在這里插入圖片描述

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

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

1)引入依賴

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

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

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

2)配置文件

服務(wù)發(fā)現(xiàn)也需要知道eureka地址,因此第二步與服務(wù)注冊一致,都是配置eureka信息:

在order-service中,修改application.yml文件,添加服務(wù)名稱、eureka地址:

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

3)服務(wù)拉取和負(fù)載均衡

最后,我們要去eureka-server中拉取user-service服務(wù)的實例列表,并且實現(xiàn)負(fù)載均衡。

不過這些動作不用我們?nèi)プ?#xff0c;只需要添加一些注解即可。

在order-service的OrderApplication中,給RestTemplate這個Bean添加一個@LoadBalanced注解:

在這里插入圖片描述

修改order-service服務(wù)中的cn.itcast.order.service包下的OrderService類中的queryOrderById方法。修改訪問的url路徑,用服務(wù)名代替ip、端口:

@RestController
@RequestMapping("order")
public class OrderController {@Autowiredprivate OrderService orderService;@Autowiredprivate RestTemplate restTemplate;@GetMapping("{orderId}")public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {// 根據(jù)id查詢訂單并返回Order order = orderService.queryOrderById(orderId);// 根據(jù)訂單關(guān)聯(lián)的用戶id遠(yuǎn)程查詢用戶信息Long userId = order.getUserId();                  // 服務(wù)名稱User user = restTemplate.getForObject("http://userservice/user/" + userId, User.class);order.setUser(user);return order;}
}

spring會自動幫助我們從eureka-server端,根據(jù)userservice這個服務(wù)名稱,獲取實例列表,而后完成負(fù)載均衡。

4.Ribbon負(fù)載均衡

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

4.1.負(fù)載均衡原理

SpringCloud底層其實是利用了一個名為Ribbon的組件,來實現(xiàn)負(fù)載均衡功能的。

在這里插入圖片描述

那么我們發(fā)出的請求明明是http://userservice/user/1,怎么變成了http://localhost:8081的呢?

4.2.源碼跟蹤

為什么我們只輸入了service名稱就可以訪問了呢?之前還要獲取ip和端口。

顯然有人幫我們根據(jù)service名稱,獲取到了服務(wù)實例的ip和端口。它就是LoadBalancerInterceptor,這個類會在對RestTemplate的請求進行攔截,然后從Eureka根據(jù)服務(wù)id獲取服務(wù)列表,隨后利用負(fù)載均衡算法得到真實的服務(wù)地址信息,替換服務(wù)id。

我們進行源碼跟蹤:

1)LoadBalancerIntercepor

在這里插入圖片描述

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

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

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

2)LoadBalancerClient

繼續(xù)跟入execute方法:

在這里插入圖片描述

在這里插入圖片描述

代碼是這樣的:

  • getLoadBalancer(serviceId):根據(jù)服務(wù)id獲取ILoadBalancer,而ILoadBalancer會拿著服務(wù)id去eureka中獲取服務(wù)列表并保存起來。
  • getServer(loadBalancer):利用內(nèi)置的負(fù)載均衡算法,從服務(wù)列表中選擇一個。本例中,可以看到獲取了8082端口的服務(wù)

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

在這里插入圖片描述

果然實現(xiàn)了負(fù)載均衡。

3)負(fù)載均衡策略IRule

在剛才的代碼中,可以看到獲取服務(wù)使通過一個getServer方法來做負(fù)載均衡:

在這里插入圖片描述

我們繼續(xù)跟入:

在這里插入圖片描述

繼續(xù)跟蹤源碼chooseServer方法,發(fā)現(xiàn)這么一段代碼:

在這里插入圖片描述

我們看看這個rule是誰:

在這里插入圖片描述

這里的rule默認(rèn)值是一個RoundRobinRule,看類的介紹:

在這里插入圖片描述

這不就是輪詢的意思嘛。

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

4)總結(jié)

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

在這里插入圖片描述

基本流程如下:

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

4.3.負(fù)載均衡策略

4.3.1.負(fù)載均衡策略

負(fù)載均衡的規(guī)則都定義在IRule接口中,而IRule有很多不同的實現(xiàn)類:

在這里插入圖片描述

不同規(guī)則的含義如下:

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

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

4.3.2.自定義負(fù)載均衡策略

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

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

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

4.4.饑餓加載

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

而饑餓加載則會在項目啟動時創(chuàng)建,降低第一次訪問的耗時,通過下面配置開啟饑餓加載:

ribbon:eager-load:enabled: trueclients: userservice # 指定被調(diào)用微服務(wù)饑渴加載

5.Nacos注冊中心

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

5.1.認(rèn)識和安裝Nacos

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

在這里插入圖片描述

安裝方式可以參考課前資料《Nacos安裝指南.md》

5.2.服務(wù)注冊到nacos

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

主要差異在于:

  • 依賴不同
  • 服務(wù)地址不同

1)引入依賴

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

 <dependencyManagement>
<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)重啟

重啟微服務(wù)后,登錄nacos管理頁面,可以看到微服務(wù)信息:

在這里插入圖片描述

5.3.服務(wù)分級存儲模型

一個服務(wù)可以有多個實例,例如我們的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是服務(wù),一個服務(wù)可以包含多個集群,如杭州、上海,每個集群下可以有多個實例,形成分級模型,如圖:

在這里插入圖片描述

微服務(wù)互相訪問時,應(yīng)該盡可能訪問同集群實例,因為本地訪問速度更快。當(dāng)本集群內(nèi)不可用時,才訪問其它集群。例如:

在這里插入圖片描述

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

5.3.1.給user-service配置集群

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

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

重啟兩個user-service實例后,我們可以在nacos控制臺看到下面結(jié)果:

在這里插入圖片描述

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

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

配置如圖所示:

在這里插入圖片描述

啟動UserApplication3后再次查看nacos控制臺:

在這里插入圖片描述

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

默認(rèn)的ZoneAvoidanceRule并不能實現(xiàn)根據(jù)同集群優(yōu)先來實現(xiàn)負(fù)載均衡。

因此Nacos中提供了一個NacosRule的實現(xiàn),可以優(yōu)先從同集群中挑選實例。

1)給order-service配置集群信息

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

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

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

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

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

5.4.權(quán)重配置

實際部署中會出現(xiàn)這樣的場景:

服務(wù)器設(shè)備性能有差異,部分實例所在機器性能較好,另一些較差,我們希望性能好的機器承擔(dān)更多的用戶請求。

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

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

在nacos控制臺,找到user-service的實例列表,點擊編輯,即可修改權(quán)重:

在這里插入圖片描述

在彈出的編輯窗口,修改權(quán)重:

在這里插入圖片描述

注意:如果權(quán)重修改為0,則該實例永遠(yuǎn)不會被訪問

5.5.環(huán)境隔離

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

  • nacos中可以有多個namespace
  • namespace下可以有g(shù)roup、service等
  • 不同namespace之間相互隔離,例如不同namespace的服務(wù)互相不可見

在這里插入圖片描述

5.5.1.創(chuàng)建namespace

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

在這里插入圖片描述

我們可以點擊頁面新增按鈕,添加一個namespace:

在這里插入圖片描述

然后,填寫表單:

在這里插入圖片描述

就能在頁面看到一個新的namespace:

在這里插入圖片描述

5.5.2.給微服務(wù)配置namespace

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

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

spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空間,填I(lǐng)D

重啟order-service后,訪問控制臺,可以看到下面的結(jié)果:

在這里插入圖片描述

在這里插入圖片描述

此時訪問order-service,因為namespace不同,會導(dǎo)致找不到userservice,控制臺會報錯:

在這里插入圖片描述

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

Nacos的服務(wù)實例分為兩種l類型:

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

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

配置一個服務(wù)實例為永久實例:

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

Nacos和Eureka整體結(jié)構(gòu)類似,服務(wù)注冊、服務(wù)拉取、心跳等待,但是也存在一些差異:

在這里插入圖片描述

  • Nacos與eureka的共同點

    • 都支持服務(wù)注冊和服務(wù)拉取
    • 都支持服務(wù)提供者心跳方式做健康檢測
  • Nacos與Eureka的區(qū)別

    • Nacos支持服務(wù)端主動檢測提供者狀態(tài):臨時實例采用心跳模式,非臨時實例采用主動檢測模式
    • 臨時實例心跳不正常會被剔除,非臨時實例則不會被剔除
    • Nacos支持服務(wù)列表變更的消息推送模式,服務(wù)列表更新更及時
    • Nacos集群默認(rèn)采用AP方式,當(dāng)集群中存在非臨時實例時,采用CP模式;Eureka采用AP方式

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

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

spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空間,填I(lǐng)D

重啟order-service后,訪問控制臺,可以看到下面的結(jié)果:

[外鏈圖片轉(zhuǎn)存中…(img-BOEepYwb-1706579626525)]

[外鏈圖片轉(zhuǎn)存中…(img-U3c2ySQh-1706579626526)]

此時訪問order-service,因為namespace不同,會導(dǎo)致找不到userservice,控制臺會報錯:

[外鏈圖片轉(zhuǎn)存中…(img-omdcXPcI-1706579626526)]

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

Nacos的服務(wù)實例分為兩種l類型:

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

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

配置一個服務(wù)實例為永久實例:

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

Nacos和Eureka整體結(jié)構(gòu)類似,服務(wù)注冊、服務(wù)拉取、心跳等待,但是也存在一些差異:

[外鏈圖片轉(zhuǎn)存中…(img-stdnAG3O-1706579626527)]

  • Nacos與eureka的共同點

    • 都支持服務(wù)注冊和服務(wù)拉取
    • 都支持服務(wù)提供者心跳方式做健康檢測
  • Nacos與Eureka的區(qū)別

    • Nacos支持服務(wù)端主動檢測提供者狀態(tài):臨時實例采用心跳模式,非臨時實例采用主動檢測模式
    • 臨時實例心跳不正常會被剔除,非臨時實例則不會被剔除
    • Nacos支持服務(wù)列表變更的消息推送模式,服務(wù)列表更新更及時
    • Nacos集群默認(rèn)采用AP方式,當(dāng)集群中存在非臨時實例時,采用CP模式;Eureka采用AP方式
http://www.risenshineclean.com/news/28952.html

相關(guān)文章:

  • 重慶市建設(shè)工程招標(biāo)投標(biāo)交易信息網(wǎng)山西seo基礎(chǔ)教程
  • 分布式wordpress網(wǎng)頁seo
  • 外國優(yōu)秀網(wǎng)站設(shè)計青島關(guān)鍵詞優(yōu)化平臺
  • 網(wǎng)站建設(shè)做什么百度收錄查詢工具
  • 互聯(lián)網(wǎng) 政府門戶網(wǎng)站建設(shè)方案最新國際新聞50條簡短
  • 網(wǎng)站后期維護費用邯鄲seo營銷
  • 做黃色網(wǎng)站怎么賺錢精準(zhǔn)防控高效處置
  • 價格劃算的東莞建網(wǎng)站公司優(yōu)化營商環(huán)境評價
  • 東莞物流公司張家界seo
  • 江蘇 做網(wǎng)站推廣目標(biāo)怎么寫
  • 國外電商網(wǎng)站如何做icp備案網(wǎng)頁seo是什么意思
  • 泵 品牌網(wǎng)站建設(shè)深圳網(wǎng)站建設(shè)系統(tǒng)
  • 情人節(jié)給女朋友做網(wǎng)站線上推廣軟件
  • 南京公司網(wǎng)站開發(fā)合肥瑤海區(qū)
  • 一個jsp做的購物小網(wǎng)站搜索引擎優(yōu)化的方法和技巧
  • wordpress文庫插件搜索引擎優(yōu)化的流程
  • wordpress裝在根目錄文件夾中_如何通過域名直接訪問?google關(guān)鍵詞seo
  • 四川省建筑設(shè)計院排名seo哪家公司好
  • 動態(tài)網(wǎng)站數(shù)據(jù)庫設(shè)計seo搜索引擎優(yōu)化排名哪家更專業(yè)
  • 在網(wǎng)上如何找做網(wǎng)站的人品牌營銷策略分析
  • 企業(yè)網(wǎng)站建設(shè)費用定金怎么做賬關(guān)鍵詞查網(wǎng)址
  • 昆山做網(wǎng)站哪家好百度競價排名廣告定價鮮花
  • 做網(wǎng)站用什么軟件知乎google瀏覽器下載
  • 企業(yè)做定制網(wǎng)站的好處自助建站免費建站平臺
  • 網(wǎng)站出現(xiàn)的的問題軟文營銷案例
  • 泰安網(wǎng)站制作seo海外
  • 做電池的外貿(mào)網(wǎng)站廣州日新增51萬人
  • 哪個網(wǎng)站不花錢可以做招聘互聯(lián)網(wǎng)營銷的特點
  • wordpress下載器插件廣東seo價格是多少錢
  • 網(wǎng)站建設(shè) 日志免費外鏈網(wǎng)