zoukankan      html  css  js  c++  java
  • springcloudalibaba整合dubbo

    记一次springcloud-alibaba框架下整合spring-cloud-starter-dubbo

    现状: 现在微服务之间的相互调用使用feign

    接口都需要注解@FeignClient,例:@FeignClient(contextId = "sysRoleMenuService", value = FeignConstants.UserClient, fallbackFactory = SysRoleMenuServiceFallBack.class)

    在原框架基础上集成dubbo

    一、提供api接口

    public interface TestService {
        String test(String name);
    }

    二、服务提供者

    1.引入相关的pom配置

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

    2.dubbo相关配置

    dubbo:
      scan:
        base-packages: com.cloud.rapid.user.service.api.dubbo
      protocol:    #Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始)
        name: dubbo
        port: -1  #dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80;如果没有配置port,则自动采用默认端口,如果配置为-1,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控
      registry:
        #dubbo服务注册端口,注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port
        #其中前缀spring-cloud说明:挂载到 Spring Cloud注册中心
        address: spring-cloud://119.3.107.157:8848
        # address: spring-cloud://localhost
        #check: false  #关闭注册中心是否启动的相关检查,false表示不检查注册中心是否启动,就不会报错
    #  cloud:
    #    subscribed-services: dubbo-product
      provider:
        timeout: 10000

    3.启动类加上@EnableDubbo注解

    @EnableShardingJdbc
    @EnableDiscoveryClient
    @SpringBootApplication
    @EnableDubbo
    public class RapidUserServiceApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(RapidUserServiceApplication.class, args);
        }
    }

    4.实现api接口

    package com.cloud.rapid.user.service.impl.dubbo;
    
    import com.cloud.rapid.user.service.api.dubbo.TestService;
    import org.apache.dubbo.config.annotation.Service;
    import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
    
    // 注意该serveice为dubbo的注解,不是framework的,引入应该为import org.apache.dubbo.config.annotation.Service;
    @Service
    public class TestServiceImpl implements TestService {
        @Override
        public String test(String name) {
            return "hello " + name;
        }
    }

    三、服务消费者

    1.引入相关的pom配置

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

    2.dubbo相关配置

    dubbo:
      consumer:
        timeout: 5000
        check: false  #关闭订阅服务是否启动的检查【检查时,没有服务提供者会报错】
      protocol:    #Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始)
        name: dubbo
        port: -1  #dubbo协议缺省端口为20880,rmi协议缺省端口为1099,http和hessian协议缺省端口为80;如果没有配置port,则自动采用默认端口,如果配置为-1,则会分配一个没有被占用的端口。Dubbo 2.4.0+,分配的端口在协议缺省端口的基础上增长,确保端口段可控
      registry:
        #其中前缀spring-cloud说明:挂载到 Spring Cloud注册中心
        address: spring-cloud://119.3.107.157:8848
        # address: spring-cloud://localhost  #dubbo服务注册端口,注册中心服务器地址,如果地址没有端口缺省为9090,同一集群内的多个地址用逗号分隔,如:ip:port,ip:port
      cloud:
        subscribed-services: rapid-user-service

    3.调用api接口,实现dubbo

    package com.cloud.rapid.company.web.controller.dubbo;
    
    import com.cloud.rapid.common.security.annotation.Inner;
    import com.cloud.rapid.user.service.api.dubbo.TestService;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.dubbo.config.annotation.Reference;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/test")
    @Slf4j
    public class TestController {
    
        @Reference
        private TestService testService;
    
        @Inner
        @PostMapping("/cjq")
        public String test() {
            String str = testService.test("cjq");
            log.info("str:{}", str);
            return str;
        }
    }

    四、备注

    1.dubbo中在消费方和服务方都配置超时时间timeout的情况,会以消费方(controller)的设置的timeout时间为准。

    2.dubbo和feign的区别: 

    相同点:Dubbo 与 Feign 都依赖注册中心、负载均衡。

    不同点:

    1、协议

    Dubbo:

    支持多传输协议(Dubbo、Rmi、http、redis等等),可以根据业务场景选择最佳的方式。非常灵活。
    默认的Dubbo协议:利用Netty,TCP传输,单一、异步、长连接,适合数据量小、高并发和服务提供者远远少于消费者的场景。
    Feign:

    基于Http传输协议,短连接,不适合高并发的访问。

    2、负载均衡

    Dubbo:

    支持4种算法(随机、轮询、活跃度、Hash一致性),而且算法里面引入权重的概念。
    配置的形式不仅支持代码配置,还支持Dubbo控制台灵活动态配置。
    负载均衡的算法可以精准到某个服务接口的某个方法。
    Feign:

    只支持N种策略:轮询、随机、ResponseTime加权。
    负载均衡算法是Client级别的。
    3、容错策略

    Dubbo:

    支持多种容错策略:failover、failfast、brodecast、forking等,也引入了retry次数、timeout等配置参数。

    Feign:

    利用熔断机制来实现容错的,处理的方式不一样。

    比较项Feign(RESTful)Dubbo
    通讯协议 HTTP 默认Dubbo协议
    性能 略低 较高
    灵活度
    当能力支撑不了野心时,就该静下心来学习!
  • 相关阅读:
    Activity相关
    关于JNI接口封装(将so接口调用封装到jar包)
    在android系统源码目录下编译apk
    【原创】分享一个分析函数统计案例
    【原创】Oracle函数中对于NO_DATA_FOUND异常处理的研究
    【原创】一种维护型项目升级打包的解决方案
    【原创】如何找到Oracle中哪条记录被锁
    【原创】ORA-04068: 已丢弃程序包 的当前状态研究
    【原创】CQ数据库损坏修复
    【原创】物化视图日志对性能的影响测试
  • 原文地址:https://www.cnblogs.com/1234cjq/p/15740904.html
Copyright © 2011-2022 走看看