Spring Cloud Alibaba 3 Dubbo搭建


Spring Cloud Alibaba 3 Dubbo搭建

dubbo

负载均衡:随机,轮循,最少活跃数(慢的提供者收到更少请求),一致性hash(相同参数请求发送到同一提供者)
服务重试:消费超时,报错会重试其它实例

@DubboService(cluster = "failfast")

Failover Cluster 这是dubbo中默认的集群容错模式 失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过retries="2"来设置重试次数(不含第一次)。
Failfast Cluster 快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster 失败安全,出现异常时,直接忽略。 通常用于写入审计日志等操作。
Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster 并行调用多个服务器,只要一个成功即返回。 通常用于实时性要求较高的读操作,但需要浪费更多服务资源。 可通过forks="2"来设置最大并行数。
Broadcast Cluster 广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持) 通常用于通知所有提供者更新缓存或日志等本地资源信息。

服务降级:服务消费者在调用某个服务提供者时,如果该服务提供者报错了,所采取的措施。

项目结构

  • 项目有三个子项目,dubbo-api存放公共接口,nacos作为提供远程服务,sentinel作为消费远程服务

dubbo-api

  • pom.xml:
    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
    		
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
  • 编写一个接口
    public interface UserService {
    
    	/**
    	 * description: 测试
    	 * @author zwq
    	 * @date 2022/4/13 17:22
    	 * @return java.lang.String
    	 */
    	String getString();
    
    }
  • 完成,只是提供公共的接口,没有其他作用。

nacos(提供服务)

  • pom.xml(在之前nacos,sentinel项目依赖基础上):
    <!--dubbo-api 项目 依赖-->
            <dependency>
                <groupId>com.zzz</groupId>
                <artifactId>dubbo-api</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <scope>compile</scope>
            </dependency>
    <!-- Dubbo依赖 -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>3.0.4</version>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
                <version>3.0.2.1</version>
            </dependency>
  • 配置文件:
  • application.yml:
    server:
      port: 18084
    
    dubbo:
      scan:
        base-packages: com.zzz.pped
      protocol:
        name: dubbo
        port: -1
      registry:
        address: nacos://127.0.0.1:8848
    
    spring:
      main:
        # 解决Bean重复定义问题
        allow-bean-definition-overriding: true
  • bootstrap.yml(和之前加入nacos,sentinel后配置相同):
    spring:
      application:
        # 服务名
        name: pped-nacos
      cloud:
        sentinel:
          transport:
            dashboard: 127.0.0.1:8180
            port: 8102
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
            group: PPED_GROUP
          config:
            # 是否开启配置中心 默认true
            enabled: true
            # 配置中心地址
            server-addr: 127.0.0.1:8848
            # 配置文件后缀
            file-extension: yml
            # 配置对应的分组
            group: PPED_GROUP
            # 命名空间 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
            # namespace: ba42e722-81aa-48f1-9944-9dca57d5f396
            # Nacos 认证用户
            username: nacos
            # Nacos 认证密码
            password: nacos
            # 支持多个共享 Data Id 的配置,优先级小于extension-configs,自定义 Data Id 配置 属性是个集合,内部由 Config POJO 组成。Config 有 3 个属性,分别是 dataId, group 以及 refresh
            shared-configs[0]:
              data-id: pped-ok.yml # 配置文件名-Data Id
              group: PPED_GROUP   # 默认为DEFAULT_GROUP
              refresh: true   # 是否动态刷新,默认为false
            shared-configs[1]:
              data-id: pped-1.yml # 配置文件名-Data Id
              group: PPED_GROUP   # 默认为DEFAULT_GROUP
              refresh: true   # 是否动态刷新,默认为false
            refresh-enabled: true
  • 入口添加启动注解
    @EnableDubbo
    @EnableDiscoveryClient
    public class NacosApplication {
  • 实现dubbo-api的公共接口:
    @DubboService
    public class UserServiceImpl implements UserService {
    	/**
    	 * description: 测试
    	 *
    	 * @return java.lang.String
    	 * @author zwq
    	 * @date 2022/4/13 17:22
    	 */
    	@Override
    	public String getString() {
    		return "hello i'm nacos";
    	}
    }

sentinel(消费服务)

  • pom.xml(同nacos):
    <!-- Dubbo依赖 -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>3.0.4</version>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
                <version>3.0.2.1</version>
            </dependency>
    
    <!--dubbo-api 项目 依赖-->
            <dependency>
                <groupId>com.zzz</groupId>
                <artifactId>dubbo-api</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <scope>compile</scope>
            </dependency>
  • application.yml:
    server:
      port: 18085
    
    dubbo:
      scan:
        base-packages: com.zzz.pped
      protocol:
        name: dubbo
        port: -1
      registry:
        address: nacos://127.0.0.1:8848
      cloud:
        subscribed-services: 'pped-nacos'
    
    spring:
      main:
        # 解决Bean重复定义问题
        allow-bean-definition-overriding: true
    bootstrap.yml:
    spring:
      application:
        # 服务名
        name: pped-sentinel
      cloud:
        sentinel:
          transport:
            dashboard: 127.0.0.1:8180
            port: 8101
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
            group: PPED_GROUP
          config:
            # 是否开启配置中心 默认true
            enabled: true
            # 配置中心地址
            server-addr: 127.0.0.1:8848
            # 配置文件后缀
            file-extension: yml
            # 配置对应的分组
            group: PPED_GROUP
            # 命名空间 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
            # namespace: ba42e722-81aa-48f1-9944-9dca57d5f396
            # Nacos 认证用户
            username: nacos
            # Nacos 认证密码
            password: nacos
            # 支持多个共享 Data Id 的配置,优先级小于extension-configs,自定义 Data Id 配置 属性是个集合,内部由 Config POJO 组成。Config 有 3 个属性,分别是 dataId, group 以及 refresh
            shared-configs[0]:
              data-id: pped-ok.yml # 配置文件名-Data Id
              group: PPED_GROUP   # 默认为DEFAULT_GROUP
              refresh: true   # 是否动态刷新,默认为false
            shared-configs[1]:
              data-id: pped-1.yml # 配置文件名-Data Id
              group: PPED_GROUP   # 默认为DEFAULT_GROUP
              refresh: true   # 是否动态刷新,默认为false
            refresh-enabled: true
  • 编写测试接口进行消费调用
    @RestController
    @RequiredArgsConstructor
    @RefreshScope
    public class TestController {
    
    	@DubboReference
    	private UserService userService;
    
    	@GetMapping("dubbo")
    	public String dubboTest() {
    		return userService.getString();
    	}
    
    }

测试

调用接口测试:http://localhost:18085/dubbo


  目录