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:
bootstrap.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
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