網(wǎng)站下載到本地合肥seo按天收費
文章目錄
- 一、搭建Nacos服務(wù)
- 1、Nacos
- 2、安裝Nacos
- 3、Docker安裝Nacos
- 二、OpenFeign和Dubbo遠程調(diào)用Nacos的服務(wù)
- 1、搭建SpringCloudAlibaba的開發(fā)環(huán)境
- 1.1 構(gòu)建微服務(wù)聚合父工程
- 1.2 創(chuàng)建子模塊cloud-provider-payment8001
- 1.3 創(chuàng)建子模塊cloud-consumer-order80
- 2、遠程服務(wù)調(diào)用OpenFeign
- 2.1 Dubbo和OpenFeign的區(qū)別
- 2.2 創(chuàng)建子模塊cloud-consumer-openfeign-order80
- 2.3 OpenFeign實現(xiàn)服務(wù)降級
- 3、遠程服務(wù)調(diào)用Dubbo
- 3.1 創(chuàng)建接口服務(wù)工程cloud-service-api
- 3.2 創(chuàng)建支付生產(chǎn)者工程cloud-dubbo-provider-payment8001
- 3.3創(chuàng)建消費者cloud-dubbo-consumer-order80
- 3.4 Dubbo實現(xiàn)服務(wù)降級
- 總結(jié)
一、搭建Nacos服務(wù)
1、Nacos
- Nacos是阿里巴巴開源的服務(wù)注冊中心以及配置中心,致力于給開發(fā)者提供一款便捷、簡單上手的開源框架。
Nacos包含了SpringCloud的注冊中心Eureka、服務(wù)配置Config、服務(wù)總線Bus。 - Nacos提供四大功能,分別是服務(wù)發(fā)現(xiàn)和服務(wù)健康監(jiān)測、動態(tài)配置服務(wù)、動態(tài)DNS服務(wù)、服務(wù)及其元數(shù)據(jù)管理。
1)服務(wù)發(fā)現(xiàn)和服務(wù)健康監(jiān)測
Nacos使服務(wù)更容易注冊,并通過DNS或HTTP接口發(fā)現(xiàn)其他服務(wù),Nacos還提供服務(wù)的實時健康檢查,以防止向不健康的主機或服務(wù)實例發(fā)送請求。
2)動態(tài)配置服務(wù)
動態(tài)配置服務(wù)允許在所有環(huán)境中以集中和動態(tài)的方式管理所有服務(wù)的配置。Nacos消除了在更新配置時重新部署應(yīng)用程序,這使得配置的更改更加高效和靈活。
3)動態(tài)DNS服務(wù)
Nacos提供基于DNS協(xié)議的服務(wù)發(fā)現(xiàn)能力,旨在支持異構(gòu)語言的服務(wù)發(fā)現(xiàn),支持將注冊在Nacos上的服務(wù)以域名的方式暴露端點,讓第三方應(yīng)用方便查閱及發(fā)現(xiàn)。
4)服務(wù)及其元數(shù)據(jù)管理
Nacos能讓你從微服務(wù)平臺建設(shè)的視覺去管理數(shù)據(jù)中心的所有服務(wù)及元數(shù)據(jù),包括管理服務(wù)的描述、生命周期、服務(wù)的靜態(tài)依賴分析、服務(wù)的健康狀態(tài)、服務(wù)的流量管理、路由及安全策略。
2、安裝Nacos
- 在官網(wǎng)下載Linux的Nacos安裝包:
https://github.com/alibaba/nacos/releases
- 通過mobax將安裝包上傳到虛擬機的/opt目錄下
- 解壓到/usr/local目錄下:
tar -zxvf nacos-server-2.2.3.tar.gz -C /usr/local
- 需要在虛擬機上配置JDK8以上的環(huán)境:
https://blog.csdn.net/weixin_49076273/article/details/126636650
- 進入到nacos的bin目錄下,啟動單機模式的nacos服務(wù)器:
sh startup.sh -m standalone
- 在瀏覽器訪問:
http://192.168.126.32:8848/nacos/
3、Docker安裝Nacos
-
安裝Docker:
https://blog.csdn.net/weixin_49076273/article/details/126532188
-
使用Docker拉取鏡像:
docker pull nacos/nacos-server:v2.2.0
-
單機版部署:
docker run --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODE=standalone -e NACOS_SERVER_IP=192.168.126.32 nacos/nacos-server:v2.2.0
-
在瀏覽器訪問:
http://192.168.126.32:8848/nacos/
帳號密碼都是nacos
使用docker容器搭建nacos,如果是nacos2.x需要把9848,9849這兩個端口開放出來即可,這樣就可以使用IDEA連接上Nacos。如果是1.x則直接使用8848端口即可
二、OpenFeign和Dubbo遠程調(diào)用Nacos的服務(wù)
1、搭建SpringCloudAlibaba的開發(fā)環(huán)境
1.1 構(gòu)建微服務(wù)聚合父工程
-
創(chuàng)建父工程springcloudalibaba
-
配置注解生效激活
-
Java編譯版本選擇
-
父工程的POM文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zzx</groupId><artifactId>springcloudalibaba</artifactId><version>1.0-SNAPSHOT</version><!-- 統(tǒng)一管理jar包版本 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><spring-cloud.version>2021.0.0</spring-cloud.version><spring-boot.version>2.6.3</spring-boot.version></properties><!-- 子模塊繼承之后,提供作用:鎖定版本+子modlue不用寫groupId和version --><dependencyManagement><dependencies><!--spring boot 2.6.3--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!--spring cloud 2021.0.0--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>
-
IDEA開啟Dashboard
1)修改配置文件.idea/workspace.xml
2)添加如下配置<component name="RunDashboard"><option name="ruleStates"><list><RuleState><option name="name" value="ConfigurationTypeDashboardGroupingRule" /></RuleState><RuleState><option name="name" value="StatusDashboardGroupingRule" /></RuleState></list></option><option name="configurationTypes"><set><option value="SpringBootApplicationConfigurationType" /></set> </option> </component>
-
刪除src目錄
1.2 創(chuàng)建子模塊cloud-provider-payment8001
-
在父工程下,右鍵創(chuàng)建子模塊cloud-provider-payment8001
-
在cloud-provider-payment8001的POM文件中添加如下依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> </dependencies>
-
創(chuàng)建cloud-provider-payment8001的主啟動類
package com.zzx;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** 主啟動類*/// 注解開啟注冊發(fā)現(xiàn)服務(wù)功能 @EnableDiscoveryClient @SpringBootApplication @Slf4j public class PaymentMain8001 {public static void main(String[] args) {SpringApplication.run(PaymentMain8001.class,args);log.info("****** PaymentMain8001 啟動成功 ******");} }
-
在cloud-provider-payment8001的com.zzx.controller包下,創(chuàng)建PaymentController
package com.zzx.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;/*** 支付控制層*/ @RestController @RequestMapping("payment") public class PaymentController {@GetMapping("index")public String index(){return "payment success";} }
-
在cloud-provider-payment8001的resources中,創(chuàng)建application.yml文件
server:port: 8001 spring:application:name: payment-providercloud:nacos:discovery:# Nacos服務(wù)的地址server-addr: 192.168.126.32:8848
-
啟動payment8001項目后,在Nacos中的服務(wù)管理的服務(wù)列表中會出現(xiàn)該服務(wù)
1.3 創(chuàng)建子模塊cloud-consumer-order80
-
在父工程下,右鍵創(chuàng)建子模塊cloud-consumer-order80
-
在cloud-consumer-order80的POM文件中添加如下依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> </dependencies>
-
創(chuàng)建cloud-consumer-order80的主啟動類
package com.zzx;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** 主啟動類*/// 注解開啟注冊發(fā)現(xiàn)服務(wù)功能 @EnableDiscoveryClient @SpringBootApplication @Slf4j public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class,args);log.info("****** OrderMain80 啟動成功 ******");} }
-
在cloud-consumer-order80的resources中,創(chuàng)建application.yml文件
server:port: 80 spring:application:name: order-consumercloud:nacos:discovery:# Nacos服務(wù)的地址server-addr: 192.168.126.32:8848
-
啟動order80項目后,在Nacos中的服務(wù)管理的服務(wù)列表中會出現(xiàn)該服務(wù)
2、遠程服務(wù)調(diào)用OpenFeign
2.1 Dubbo和OpenFeign的區(qū)別
- Apache Dubbo是一款微服務(wù)開發(fā)框架,他提供了RPC通信與微服務(wù)治理兩大關(guān)鍵能力。這意味著使用Dubbo開發(fā)的微服務(wù),將具備相互之間的遠程發(fā)現(xiàn)和通信能力,同時利用Dubbo提供的豐富服務(wù)治理能力,可以實現(xiàn)諸如服務(wù)發(fā)現(xiàn)、負載均衡、流量調(diào)控等服務(wù)治理訴求。
- SpringCloud的通信采用OpenFeign組件。Feign基于Http傳輸協(xié)議,底層實現(xiàn)是Rest。從OSI7層模型上來看Rest屬于應(yīng)用層。
OpenFeign在高并發(fā)場景下性能不夠理想,成為性能瓶頸。
使用場景:并發(fā)不高,性能要求也不高 - Dubbo框架的通信協(xié)議采用RPC協(xié)議,屬于傳輸層協(xié)議,性能上自然比rest高。提升了交互的性能,保持了長連接,高性能。
Dubbo性能更好,比如支持異步調(diào)用、Netty性能更好。
使用場景:數(shù)據(jù)小,并發(fā)高
2.2 創(chuàng)建子模塊cloud-consumer-openfeign-order80
-
在父工程下,右鍵創(chuàng)建子模塊cloud-consumer-openfeign-order80
-
在cloud-consumer-openfeign-order80的POM文件中添加如下依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- 引入openfeign依賴包 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- 引入負載均衡器依賴包 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency> </dependencies>
-
創(chuàng)建cloud-consumer-openfeign-order80的主啟動類
package com.zzx;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients;/*** 主啟動類*/// 注解開啟注冊發(fā)現(xiàn)服務(wù)功能 @EnableDiscoveryClient // 開啟feign掃描 @EnableFeignClients @SpringBootApplication @Slf4j public class OrderOpenFeignMain80 {public static void main(String[] args) {SpringApplication.run(OrderOpenFeignMain80.class,args);log.info("****** OrderOpenFeignMain80 啟動成功 ******");} }
-
在cloud-consumer-openfeign-order80的com.zzx.service包中,創(chuàng)建IPaymentFeignService接口
package com.zzx.service;import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.GetMapping;/*** OpenFeign遠程調(diào)用*/ @Service @FeignClient(value = "payment-provider") public interface IPaymentFeignService {@GetMapping("/payment/index")String index(); }
-
在cloud-consumer-openfeign-order80的com.zzx.controller包中,創(chuàng)建OrderController
package com.zzx.controller;import com.zzx.service.IPaymentFeignService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;/*** 訂單微服務(wù)*/ @RestController @RequestMapping("order") public class OrderController {@Autowiredprivate IPaymentFeignService iPaymentFeignService;/*** 測試OpenFeign* @return*/@GetMapping("index")public String index(){return iPaymentFeignService.index();} }
-
在cloud-consumer-openfeign-order80的resources中,創(chuàng)建application.yml文件
server:port: 80 spring:application:name: order-consumer-openfeigncloud:nacos:discovery:# Nacos服務(wù)的地址server-addr: 192.168.126.32:8848
-
啟動openfeign-order80項目后,在Nacos中的服務(wù)管理的服務(wù)列表中會出現(xiàn)該服務(wù)
-
在瀏覽器上測試使用OpenFeign進行遠程服務(wù)調(diào)用,輸入:
http://localhost/order/index
此時返回payment success即調(diào)用成功
2.3 OpenFeign實現(xiàn)服務(wù)降級
-
在cloud-consumer-openfeign-order80的POM文件中,引入服務(wù)降級的依賴
<!-- 引入服務(wù)降級依賴包 --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
-
在cloud-consumer-openfeign-order80的resources下的application.yml文件中,添加如下配置開啟openfeign對sentinel的支持
feign:sentinel:enabled: true
-
在cloud-provider-payment8001的PaymentController中添加如下超時方法
@GetMapping("timeout") public String timeout(){try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {throw new RuntimeException(e);}return "payment success"; }
-
在cloud-consumer-openfeign-order80的OrderController中添加如下超時方法
@GetMapping("timeout") public String timeout(){return iPaymentFeignService.timeout(); }
-
在cloud-consumer-openfeign-order80的IPaymentFeignService中添加如下超時方法
@GetMapping("/payment/timeout") String timeout();
-
在瀏覽器上測試使用OpenFeign進行遠程服務(wù)調(diào)用,輸入:
http://localhost/order/timeout
此時返回報500錯誤,控制臺顯示讀取超時
-
實現(xiàn)服務(wù)降級的回調(diào)方法
-
需要在cloud-consumer-openfeign-order80的IPaymentFeignService接口中指定服務(wù)降級回調(diào)類
@FeignClient(value = "payment-provider",fallback = PaymentServiceFallback.class)
2)在cloud-consumer-openfeign-order80的com.zzx.fallback包下,創(chuàng)建PaymentServiceFallback服務(wù)降級回調(diào)類
package com.zzx.fallback;import com.zzx.service.IPaymentFeignService; import org.springframework.stereotype.Component;@Component public class PaymentServiceFallback implements IPaymentFeignService {@Overridepublic String index() {return null;}/*** 服務(wù)降級方法* @return*/@Overridepublic String timeout() {return "系統(tǒng)繁忙,請稍后再試";} }
- 在瀏覽器訪問:
http://localhost/order/timeout
此時會進行服務(wù)降級,回調(diào)服務(wù)降級類對應(yīng)的方法
3、遠程服務(wù)調(diào)用Dubbo
3.1 創(chuàng)建接口服務(wù)工程cloud-service-api
-
在父工程下,右鍵創(chuàng)建子模塊cloud-service-api
-
創(chuàng)建一個公共支付接口
package com.zzx.service;/*** 支付接口*/ public interface IPaymentService {String index(); }
3.2 創(chuàng)建支付生產(chǎn)者工程cloud-dubbo-provider-payment8001
-
在父工程下,右鍵創(chuàng)建子模塊cloud-dubbo-provider-payment8001
-
在cloud-dubbo-provider-payment8001的POM文件中,添加如下依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.zzx</groupId><artifactId>cloud-service-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId><version>2021.0.1.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency> </dependencies>
-
在cloud-dubbo-provider-payment8001中創(chuàng)建主啟動類PaymentDubboMain8001
package com.zzx;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** 主啟動類*/ @SpringBootApplication @Slf4j @EnableDiscoveryClient public class PaymentDubboMain8001 {public static void main(String[] args) {SpringApplication.run(PaymentDubboMain8001.class,args);log.info("********** PaymentDubboMain8001 啟動成功 ***********");} }
-
在cloud-dubbo-provider-payment8001的resources中,創(chuàng)建application.yml,添加如下配置
server:port: 8001 spring:main:allow-bean-definition-overriding: trueallow-circular-references: trueapplication:# 應(yīng)用名name: payment-provider-dubbocloud:nacos:discovery:# Nacos服務(wù)地址server-addr: 192.168.126.32:8848 # dubbo配置 dubbo:# dubbo 服務(wù)實現(xiàn)類掃描包scan:base-packages: com.zzx.serviceregistry:# 注冊地址address: nacos://192.168.126.32:8848timeout: 10000# Dubbo服務(wù)暴露協(xié)議的配置protocol:name: dubbo# port為協(xié)議端口,(-1表示自增端口,從20880開始)port: -1
-
在cloud-dubbo-provider-payment8001中,創(chuàng)建支付業(yè)務(wù)層PaymentServiceImpl
package com.zzx.service.impl;import com.zzx.service.IPaymentService; import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.config.annotation.Method;/*** 支付業(yè)務(wù)層*/ //以下是只將index方法注冊到dubbo中 @DubboService(timeout = 5000,methods = {@Method(name="index",retries = 2)}) public class PaymentServiceImpl implements IPaymentService {@Overridepublic String index() {return "dubbo payment";} }
-
啟動該服務(wù)后,查看該服務(wù)是否在Nacos中注冊
3.3創(chuàng)建消費者cloud-dubbo-consumer-order80
-
在父工程下,右鍵創(chuàng)建子模塊cloud-dubbo-consumer-order80
-
在cloud-dubbo-consumer-order80的POM文件中,添加如下依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.zzx</groupId><artifactId>cloud-service-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId><version>2021.0.1.0</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency></dependencies>
-
創(chuàng)建cloud-dubbo-consumer-order80的主啟動類
package com.zzx;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication @Slf4j @EnableDiscoveryClient public class OrderDubboMain80 {public static void main(String[] args) {SpringApplication.run(OrderDubboMain80.class,args);log.info("******* OrderDubboMain80 啟動成功 ******");} }
-
在cloud-dubbo-consumer-order80的resources中,創(chuàng)建application.yml配置文件,添加如下配置
server:port: 80 spring:main:allow-circular-references: true#在 Spring Boot 2.1 以及更高的版本增加該設(shè)定,因為 Spring Boot 默認調(diào)整了 Bean 定義覆蓋行為。allow-bean-definition-overriding: trueapplication:#應(yīng)用名字name: order-consumer-dubbocloud:nacos:discovery:#Nacos地址server-addr: 192.168.126.32:8848#dubbo配置 dubbo:cloud:#dubbo.cloud.subscribed-services:表示要訂閱服務(wù)的服務(wù)名,可以配置'*',代表訂閱所有服務(wù),不推薦使用。若需訂閱多應(yīng)用,使用 "," 分割。subscribed-services: "*"registry:# 注冊至Nacosaddress: nacos://192.168.126.32:8848# 超時時間timeout: 10000protocol:# 協(xié)議Dubboname: dubbo# 端口號port: -1consumer:check: false
-
在cloud-dubbo-consumer-order80中創(chuàng)建訂單業(yè)務(wù)層OrderService
package com.zzx.service;import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.stereotype.Service;/*** 訂單業(yè)務(wù)層*/ @Service public class OrderService {//支付服務(wù)遠程調(diào)用@DubboReferenceprivate IPaymentService iPaymentService;public String index(){return iPaymentService.index();} }
-
在cloud-dubbo-consumer-order80中創(chuàng)建訂單控制層OrderController
package com.zzx.controller;import com.zzx.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;/*** 訂單控制層*/ @RestController @RequestMapping("/order") public class OrderController {@Autowiredprivate OrderService orderService;/*** 測試Dubbo遠程調(diào)用服務(wù)* @return*/@GetMapping("/index")public String index(){return orderService.index();} }
-
啟動該服務(wù)后,在瀏覽器訪問:
http://localhost/order/index
3.4 Dubbo實現(xiàn)服務(wù)降級
-
在cloud-dubbo-provider-payment8001的PaymentServiceImpl實現(xiàn)類中,設(shè)置服務(wù)生產(chǎn)者集群容錯模式cluster
@DubboService(timeout = 5000,methods = {@Method(name="index",retries = 2)},cluster = "failfast")
1)Failfast Cluster模式:這種模式稱為快速失敗模式,調(diào)用只執(zhí)行一次,失敗則立即報錯。
2)Failsafe Cluster模式:失敗安全模式,如果調(diào)用失敗, 則直接忽略失敗的調(diào)用,而是要記錄下失敗的調(diào)用到日志文件。
3)Failback Cluster模式:失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。通常用于消息通知操作。
4)Forking Cluster模式:并行調(diào)用多個服務(wù)器,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務(wù)資源。
5)Broadcast Cluster模式:配置值為broadcast。廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報錯則報錯(2.1.0開始支持)。通常用于通知所有提供者更新緩存或日志等本地資源信息。 -
在cloud-dubbo-consumer-order80中,創(chuàng)建服務(wù)降級的回調(diào)類PaymentServiceFallback
package com.zzx.service.fallback;import com.zzx.service.IPaymentService;/*** 支付服務(wù)降級處理*/ public class PaymentServiceFallback implements IPaymentService {@Overridepublic String index() {return "服務(wù)繁忙,請稍后再試!";} }
-
在cloud-dubbo-consumer-order80的OrderService中,在DubboReference注解中添加一個mock指定回調(diào)類
@DubboReference(mock = "com.zzx.service.fallback.PaymentServiceFallback")
-
先將dubbo的生產(chǎn)者跟消費者啟動,然后關(guān)閉生產(chǎn)者,再訪問:
http://localhost/order/index
即配置了訪問服務(wù)生產(chǎn)者失敗后,立刻調(diào)用服務(wù)降級類的對應(yīng)方法。
總結(jié)
- 在高并發(fā)場景下使用Dubbo,因為Dubbo長連接,如果不是高并發(fā)會浪費資源;低并發(fā)或者性能要求不高使用OpenFeign,因為OpenFeign不是長連接并且便于使用。