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

SpringCloud微服務(wù)集成Dubbo的詳細(xì)過(guò)程

 更新時(shí)間:2024年03月29日 09:04:33   作者:sowler  
Apache?Dubbo?是一款易用、高性能的?WEB?和?RPC?框架,同時(shí)為構(gòu)建企業(yè)級(jí)微服務(wù)提供服務(wù)發(fā)現(xiàn)、流量治理、可觀測(cè)、認(rèn)證鑒權(quán)等能力、工具與最佳實(shí)踐,這篇文章主要介紹了SpringCloud微服務(wù)集成Dubbo,需要的朋友可以參考下

1、Dubbo介紹

Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架,同時(shí)為構(gòu)建企業(yè)級(jí)微服務(wù)提供服務(wù)發(fā)現(xiàn)、流量治理、可觀測(cè)、認(rèn)證鑒權(quán)等能力、工具與最佳實(shí)踐。用于解決微服務(wù)架構(gòu)下的服務(wù)治理與通信問(wèn)題,官方提供了 Java、Golang 等多語(yǔ)言 SDK 實(shí)現(xiàn)。使用 Dubbo 開(kāi)發(fā)的微服務(wù)原生具備相互之間的遠(yuǎn)程地址發(fā)現(xiàn)與通信能力, 利用 Dubbo 提供的豐富服務(wù)治理特性,可以實(shí)現(xiàn)諸如服務(wù)發(fā)現(xiàn)、負(fù)載均衡、流量調(diào)度等服務(wù)治理訴求。Dubbo 被設(shè)計(jì)為高度可擴(kuò)展,用戶可以方便的實(shí)現(xiàn)流量攔截、選址的各種定制邏輯。

Dubbo官網(wǎng):https://cn.dubbo.apache.org/zh-cn/

Dubbo文檔:https://cn.dubbo.apache.org/zh-cn/overview/quickstart/

Dubbo GitHub地址:https://github.com/apache/dubbo

Dubbo 使用版本對(duì)應(yīng)關(guān)系:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本說(shuō)明#2021x-分支 選擇和項(xiàng)目相互對(duì)應(yīng)的版本進(jìn)行使用。這里我使用的是Dubbo 2.7.8

2、Dubbo連接注冊(cè)中心

Dubbo推薦使用Zookeeper作為注冊(cè)中心,Zookeeper是Apacahe Hadoop的子項(xiàng)目,是一個(gè)樹(shù)型的目錄服務(wù),支持變更推送,適合作為 Dubbo 服務(wù)的注冊(cè)中心,工業(yè)強(qiáng)度較高,可用于生產(chǎn)環(huán)境。除此之外Dubbo還可以使用阿里巴巴的nacos做注冊(cè)中心。Nacos作為注冊(cè)中心Dubbo使用與ZooKeeper基本相同,在使用上,不同的地方只有以下兩點(diǎn):

  • 1、導(dǎo)入的依賴,配置不同;
  • 2、注解不同,ZooKeeper使用@Service、@Reference注解,Nacos使用@DubboService、@DubboReference注解;

3、Dubbo負(fù)載均衡

  • RandomLoadBalance:加權(quán)隨機(jī),默認(rèn)算法,默認(rèn)權(quán)重相同;
  • RoundRobinLoadBalance:加權(quán)輪詢,默認(rèn)權(quán)重相同;
  • LeastActiveLoadBalance:最少活躍優(yōu)先+加權(quán)隨機(jī),能者多勞;
  • ConsistentHashLoadBalance:一致性Hash,確定入?yún)?,確定提供者,適用于有狀態(tài)的請(qǐng)求;

4、Dubbo Admin下載與使用

官網(wǎng)地址:https://github.com/apache/dubbo-adminDubbo和Dubbo Admin版本說(shuō)明:https://cn.dubbo.apache.org/zh-cn/blog/2019/01/07/新版-dubbo-admin-介紹/

4.1、修改配置文件

進(jìn)入dubbo-admin-server的resources目錄,修改application.properties文件修改配置中心。默認(rèn)為zookeeper:

admin.registry.address注冊(cè)中心 
admin.config-center 配置中心 
admin.metadata-report.address元數(shù)據(jù)中心

由于我使用nacos,修改注冊(cè)中心為nacos。 nacos注冊(cè)中心有 GROUP 和 namespace:

admin.registry.address=nacos://127.0.0.1:8848?group=DEFAULT_GROUP&namespace=public&username=nacos&password=nacos
admin.config-center=nacos://127.0.0.1:8848?group=dubbo&username=nacos&password=nacos
admin.metadata-report.address=nacos://127.0.0.1:8848?group=dubbo&username=nacos&password=nacos
//改為自己的注冊(cè)中心:
admin.registry.address=nacos://localhost:8848?group=DEFAULT_GROUP&namespace=23857f22-27ac-4947-988a-1b88d4eeb807&username=nacos&password=nacos
admin.config-center=nacos://localhost:8848?group=DEFAULT_GROUP&namespace=23857f22-27ac-4947-988a-1b88d4eeb807&username=nacos&password=nacos
admin.metadata-report.address=nacos://localhost:8848?group=DEFAULT_GROUP&namespace=23857f22-27ac-4947-988a-1b88d4eeb807&username=nacos&password=nacos

4.2、Dubbo Admin項(xiàng)目打包

在項(xiàng)目根目錄進(jìn)行打包,跳過(guò)測(cè)試:

mvn clean package -Dmaven.test.skip=true

進(jìn)入dubbo-admin-0.6.0/dubbo-admin-distribution/target 進(jìn)行啟動(dòng)后端:

java -jar dubbo-admin-0.6.0.jar

dubbo-admin-ui 目錄下執(zhí)行命令啟動(dòng)前端:

npm run dev

這是官方項(xiàng)目開(kāi)發(fā)環(huán)境說(shuō)明,打開(kāi)項(xiàng)目就能看到:

4.3 訪問(wèn)dubbo admin

瀏覽器輸入地址進(jìn)行訪問(wèn),之前的dubbo-admin老版本用的是Tomcat啟動(dòng)的,后端端口是8080(可能會(huì)沖突),前端端口是8081

http://localhost:8081

新版的dubbo-admin用的是Netty,默認(rèn)配置端口是38080,前端端口38082

http://localhost:38082 或 http://localhost:38080

用戶名密碼都是root
登錄成功:

5、SpringCloud集成Dubbo

在SpringBoot模塊中引入maven依賴:

<!-- Dubbo Spring Cloud Starter -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>

這里使用用戶模塊和訂單模塊模擬微服務(wù)使用Dubbo RPC的調(diào)用。在提供者模塊中加入Dubbo依賴,在配置文件中設(shè)置dubbo連接注冊(cè)中心和配置中心:

dubbo:
  application:
    name: user-service-model-provider
  protocol:
    name: dubbo
    port: -1
  provider:
    group: DEFAULT_GROUP
    version: 2.0
  #port: 20881
  registry:
    address: nacos://${nacos.address:127.0.0.1}:8848?username=nacos&password=nacos
    #配置nacos自定義命名空間
    parameters:
      namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
    group: DEFAULT_GROUP
#  registry:
#    address: zookeeper://${zookeeper.address:127.0.0.1}:2181
  metadata-report:
    address: nacos://${nacos.address:127.0.0.1}:8848?username=nacos&password=nacos
    #配置nacos自定義命名空間
    parameters:
      namespace: 23857f22-27ac-4947-988a-1b88d4eeb807

配置添加成功后,在業(yè)務(wù)模塊service層,新建一個(gè)對(duì)外提供的dubbo實(shí)現(xiàn)類UserExternalServiceImpl,需要使用@DubboService注解,@Service注解盡量不要使用,可以使用@Componet代替。代碼如下:

//@Service
@Component
@DubboService(timeout = 1000 * 10,group = "userGroup",version = "2.0")
public class UserExternalServiceImpl implements IUserExternalService {
    @Autowired
    private IUserService userService;
    @Override
    public Response selectUserAll() {
//        try {
//            TimeUnit.MILLISECONDS.sleep(1000*5);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        return Response.success(userService.selectUserAll());
    }
    @Override
    public Response insert(UserExternal userExternal) {
//        boolean flag = true;
//        if (flag == true){
//            throw new ParamException(500,"用戶模塊出現(xiàn)錯(cuò)誤,需要回滾");
//        }
//        try {
//            TimeUnit.MILLISECONDS.sleep(20000);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        User user=new User();
        BeanUtils.copyProperties(userExternal,user);
        boolean save = userService.save(user);
        if (save){
            return Response.success();
        }else {
            return Response.fail();
        }
    }
}

然后還需要在新建一個(gè)專門(mén)存dubbo的對(duì)外接口服務(wù)模塊用interface-module名稱,在該模塊中新建一個(gè)IUserExternalService接口,該接口實(shí)現(xiàn)在用戶模塊中的UserExternalServiceImpl實(shí)現(xiàn)類:

public interface IUserExternalService {
    Response<List<UserExternal>> selectUserAll();
    Response insert(UserExternal user);
}

現(xiàn)在我們的接口提供方已經(jīng)編寫(xiě)完成了,接下來(lái)開(kāi)始編寫(xiě)接口使用方也就是消費(fèi)者。在訂單模塊中引入dubbo依賴,在配置文件中將dubbo連接注冊(cè)中心和配置中心:

dubbo:
  application:
    name: order-service-model-consumer
  consumer:
    group: DEFAULT_GROUP
    version: 2.0
  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://${nacos.address:127.0.0.1}:8848?username=nacos&password=nacos
    #配置nacos自定義命名空間
    parameters:
      namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
#  registry:
#    address: zookeeper://${zookeeper.address:127.0.0.1}:2181
  cloud:
    subscribed-services: user-service-model-provider
  metadata-report:
    address: nacos://${nacos.address:127.0.0.1}:8848?username=nacos&password=nacos
    #配置nacos自定義命名空間
    parameters:
      namespace: 23857f22-27ac-4947-988a-1b88d4eeb807

下面我們需要引入剛剛新建存dubbo接口模塊的依賴包,然后就可以使用該接口了。首先建一個(gè)IDubboUserService的接口實(shí)現(xiàn)DubboUserServiceImpl類,意思是這個(gè)類是專門(mén)存放通過(guò)dubbo接口調(diào)用用戶模塊的業(yè)務(wù)類,后續(xù)在訂單模塊中處理用戶模塊信息都可以在該業(yè)務(wù)類中進(jìn)行處理。
IDubboUserService類代碼:

public interface IDubboUserService {
    List<UserExternal> selectUserAll();
}

DubboUserServiceImpl業(yè)務(wù)類代碼,需要在該類中使用@DubboReference(group = "userGroup",version = "2.0")注解注入IUserExternalService接口信息,通過(guò)Dubbo RPC實(shí)現(xiàn)遠(yuǎn)程調(diào)用,注意group 和version 需要和提供方相互對(duì)應(yīng),不然會(huì)注入失敗:

@Service
@Slf4j
public class DubboUserServiceImpl implements IDubboUserService {
    @DubboReference(group = "userGroup",version = "2.0")
    private IUserExternalService userExternalService;
    @Override
    public List<UserExternal> selectUserAll() {
        //添加blog
        Blog blog = new Blog();
        blog.setUid(UUID.randomUUID().toString());
        blog.setTitle("dubbo測(cè)試Test");
        blog.setContent("啊");
        blog.setSummary("12");
        blog.setTagUid("3c16b9093e9b1bfddbdfcb599b23d835");
        blogService.insert(blog);
        //處理相關(guān)邏輯
        Response<List<UserExternal>> response = userExternalService.selectUserAll();
        UserExternal user = new UserExternal();
        user.setUserName("dubbo測(cè)試Test");
        user.setAccount("system");
        user.setEmail("dubbo@gemail.com");
        Response insert = userExternalService.insert(user);
        System.out.println(insert);
        return response.getModel();
    }
}

通過(guò)上面的代碼,就可以實(shí)現(xiàn)服務(wù)模塊與模塊之間的遠(yuǎn)程調(diào)用了。使用Dubbo在訂單模塊調(diào)用用戶模塊就和調(diào)用其他業(yè)務(wù)類代碼一樣通過(guò)依賴注入就可以了,是不是非常方便。

5、dubbo使用Sentinel進(jìn)行限流和異常兜底

需要引入Maven依賴:

        <!-- 在dubbo中使用 Sentinel 需要添加下面依賴 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-apache-dubbo-adapter</artifactId>
        </dependency>

由于限流和兜底是消費(fèi)方要處理的事情,所以我們只需要在訂單模塊中引入上面依賴即可。在DubboUserServiceImpl中,通過(guò)@SentinelResource注解處理,代碼如下:

@Service
@Slf4j
public class DubboUserServiceImpl implements IDubboUserService {
    @DubboReference(group = "userGroup",version = "2.0")
    private IUserExternalService userExternalService;
    @Autowired
    private IBlogService blogService;
//    @PostConstruct
//    private void initFlowRules(){
//        System.out.println("Sentinel initFlowRules start===");
//        List<FlowRule> rules = new ArrayList<>();
//        FlowRule rule = new FlowRule();
//        rule.setResource(IDubboUserService.class.getName());
//        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//        // Set limit QPS to 20.
//        rule.setCount(20);
//        rules.add(rule);
//        FlowRuleManager.loadRules(rules);
//        System.out.println("Sentinel initFlowRules end====");
//    }
    @Override
    @SentinelResource(value = "com.itmy.user.service.IUserExternalService:selectUserAll()", //當(dāng)前方法的路徑
            blockHandler = "selectUserAll",
            blockHandlerClass = CustomerBlockHandler.class, //觸發(fā)限流 走該類的blockHandler = "selectUserAll"方法
            fallback = "selectUserAllFallback",
            fallbackClass = UserFallback.class, //dubbo調(diào)用接口異常,走該類的  fallback = "selectUserAllFallback"方法
            exceptionsToIgnore = {IllegalArgumentException.class})
    //fallback 負(fù)責(zé)業(yè)務(wù)異常 blockHandler限流方法 exceptionsToIgnore 報(bào)該異常fallback不處理
    @GlobalTransactional(rollbackFor = Exception.class,timeoutMills = 30000,name = "order_tx_group")  //seata事務(wù)注解,目前沒(méi)有使用后面會(huì)在seata博客中介紹。
    public List<UserExternal> selectUserAll() {
        //添加blog
        Blog blog = new Blog();
        blog.setUid(UUID.randomUUID().toString());
        blog.setTitle("dubbo事務(wù)測(cè)試Test");
        blog.setContent("dubbo事務(wù)測(cè)試Test啊的服務(wù)器打");
        blog.setSummary("12");
        blog.setTagUid("3c16b9093e9b1bfddbdfcb599b23d835");
        blogService.insert(blog);
        //處理相關(guān)邏輯
        Response<List<UserExternal>> response = userExternalService.selectUserAll();
//        boolean flag = true;
//        if (flag == true){
//            throw new ParamException(500,"用戶模塊出現(xiàn)錯(cuò)誤,需要回滾");
//        }
        UserExternal user = new UserExternal();
        user.setUserName("dubbo事務(wù)");
        user.setAccount("system");
        user.setEmail("dubbo@gemail.com");
        Response insert = userExternalService.insert(user);
        System.out.println(insert);
        return response.getModel();
    }
}

CustomerBlockHandler處理限流的相關(guān)代碼:

@Slf4j
public class CustomerBlockHandler {
    /**
     * 查詢用戶熱點(diǎn)限流測(cè)試
     * @param name
     * @param email
     * @param exception
     * @return
     */
    public static Response selectUserBlockException(@RequestParam(value = "name",required = false) String name,
                                                    @RequestParam(value = "email",required = false) String email,
                                                    BlockException exception){
        log.error("CustomerBlockHandler|selectUserBlockException is fail");
        return Response.fail(FallbackErrorEnum.USER_MODULE_FALL);
    }
    /**
     * 查詢限流
     * @return
     */
    public static Response redisFindBlockException(BlockException exception){
        log.error("添加訂單 redis|添加用戶 redis信息,調(diào)用接口被限流。。。。。");
        return Response.fail(FallbackErrorEnum.REDIS_FIND_FALL);
    }
    public static List<UserExternal> selectUserAll(BlockException exception){
        log.error("添加訂單|添加用戶信息,觸發(fā)限流控制。。。。。");
        throw new ParamException(600,"添加用戶信息異常:"+exception.getMessage());
    }
}

UserFallback異常處理:

@Slf4j
public class UserFallback {
    public static List<UserExternal> selectUserAllFallback(Throwable throwable) {
        log.error("添加訂單|添加用戶信息異常,觸發(fā)熔斷兜底操作。");
        throw new ParamException(600,"添加用戶信息異常,觸發(fā)兜底操作");
    }
}

6、總結(jié)

SpringCloud集成Dubbo到目前為止就介紹完畢了,希望本博客對(duì)你有所幫助。目前只介紹了如何使用dubbo,dubbo還有需多需要去學(xué)習(xí)的地方,讓我們持續(xù)學(xué)習(xí)新的知識(shí),來(lái)應(yīng)對(duì)工作中的各種問(wèn)題。

到此這篇關(guān)于SpringCloud微服務(wù)集成Dubbo的文章就介紹到這了,更多相關(guān)SpringCloud集成Dubbo內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot傳輸數(shù)據(jù)時(shí)日期格式化問(wèn)題

    Springboot傳輸數(shù)據(jù)時(shí)日期格式化問(wèn)題

    這篇文章主要介紹了Springboot傳輸數(shù)據(jù)時(shí)日期格式化問(wèn)題,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • SpringBoot使用Apache Tika實(shí)現(xiàn)多種文檔的內(nèi)容解析

    SpringBoot使用Apache Tika實(shí)現(xiàn)多種文檔的內(nèi)容解析

    在日常開(kāi)發(fā)中,我們經(jīng)常需要解析不同類型的文檔,如PDF、Word、Excel、HTML、TXT等,Apache Tika是一個(gè)強(qiáng)大的內(nèi)容解析工具,可以輕松地提取文檔中的內(nèi)容和元數(shù)據(jù)信息,本文將通過(guò)SpringBoot和Apache Tika的結(jié)合,介紹如何實(shí)現(xiàn)對(duì)多種文檔格式的內(nèi)容解析
    2024-12-12
  • Java簡(jiǎn)單數(shù)組排序(冒泡法)

    Java簡(jiǎn)單數(shù)組排序(冒泡法)

    這篇文章主要介紹了Java簡(jiǎn)單數(shù)組排序,實(shí)例分析了基于冒泡法實(shí)現(xiàn)數(shù)組排序的相關(guān)技巧,簡(jiǎn)單實(shí)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Spring Validation方法實(shí)現(xiàn)原理分析

    Spring Validation方法實(shí)現(xiàn)原理分析

    這篇文章主要介紹了Spring Validation實(shí)現(xiàn)原理分析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • java接口語(yǔ)法以及與類的關(guān)系詳解

    java接口語(yǔ)法以及與類的關(guān)系詳解

    接口在JAVA編程語(yǔ)言中是一個(gè)抽象類型,是抽象方法的集合,接口通常以interface來(lái)聲明。一個(gè)類通過(guò)繼承接口的方式,從而來(lái)繼承接口的抽象方法
    2021-10-10
  • SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)動(dòng)態(tài)權(quán)限問(wèn)題

    SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)動(dòng)態(tài)權(quán)限問(wèn)題

    這篇文章主要介紹了SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)-動(dòng)態(tài)權(quán)限,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 淺析git server“丟失”commit問(wèn)題

    淺析git server“丟失”commit問(wèn)題

    這篇文章主要介紹了git server“丟失”commit問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java中生成微信小程序太陽(yáng)碼的實(shí)現(xiàn)方案

    Java中生成微信小程序太陽(yáng)碼的實(shí)現(xiàn)方案

    這篇文章主要介紹了Java中生成微信小程序太陽(yáng)碼的實(shí)現(xiàn)方案,本文講解了如何生成微信小程序太陽(yáng)碼,通過(guò)微信提供的兩種方案都可以實(shí)現(xiàn),在實(shí)際的項(xiàng)目中建議采用第二種方案,需要的朋友可以參考下
    2022-05-05
  • java?獲取子串速率比較分析

    java?獲取子串速率比較分析

    這篇文章主要為大家介紹了java?獲取子串速率比較分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java中構(gòu)造、生成XML簡(jiǎn)明教程

    Java中構(gòu)造、生成XML簡(jiǎn)明教程

    這篇文章主要介紹了Java中構(gòu)造、生成XML簡(jiǎn)明教程,本文通過(guò)dom4j包來(lái)完成,需要的朋友可以參考下
    2014-08-08

最新評(píng)論

剑阁县| 安陆市| 周口市| 屯昌县| 桦甸市| 高唐县| 威远县| 杂多县| 株洲市| 堆龙德庆县| 安图县| 福安市| 理塘县| 道孚县| 民权县| 武城县| 崇义县| 黄冈市| 永新县| 新沂市| 秦皇岛市| 文成县| 开封县| 舟山市| 晋州市| 岫岩| 黄平县| 绥阳县| 宁化县| 凤山市| 岑溪市| 和林格尔县| 云阳县| 卓资县| 福泉市| 吉林省| 洛南县| 康定县| 乌兰察布市| 平谷区| 会理县|