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协议
性能 略低 较高
灵活度
当能力支撑不了野心时,就该静下心来学习!
原文地址:https://www.cnblogs.com/1234cjq/p/15740904.html