Dubbo入门篇
dubbo官网,https://cn.dubbo.apache.org/zh-cn/
dubbo官方文档,https://cn.dubbo.apache.org/zh-cn/overview/home/
1. 概述
官方介绍,是一款云原生微服务开发框架,构建具备内置 RPC、流量管控、安全、可观测能力的应用,支持Kubernetes和VM部署环境。
个人理解,dubbo最开始的定位就是一款rpc框架,当然现在已经发展更加全面,朝着spring cloud 微服务全生态的方向发展,dubbo更侧重于rpc功能,而其他的功能,负载均衡,服务超时重试,服务容错,服务降级,服务版本管理都是对于rpc功能的扩展。
2. 快速使用
dubbo + zookeeper 快速使用
参考文档,https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/tasks/service-discovery/zookeeper/
dubbo 服务注册模式是有两种第一种是基于接口,一种是基于应用的。为了兼容之前的版本,默认值为all
register-mode: instance # 新用户请设置此值,表示启用应用级服务发现,可选值 interface、instance、all,默认值为 all,未来版本将切换默认值为 instance
分为三个module,公共的接口服务,生产者,消费者。
大致调用流程就是,导入依赖,生产者和消费者通过@EnableDubbo
分别开启dubbo
生产者先注册到zookeeper,通过@DubboService注解,使得应用与接口映射
消费者也注册到zookeeper,通过@DubboReference注解注入生产者的实例,从而调用具体功能。
注意,公共的接口服务只是提供接口,具体实现在生产者,只是为了实现生产者和消费者共用
这点和OpenFeign不一样,feign的接口服务,需要指定对应的生产者
@FeignClient(value="producer-serv", path = "/producer"
// ,fallback = ProducerServiceFallback.class
// ,fallbackFactory = ProducerServiceFallbackFactory.class
)
public interface ProducerService {
@GetMapping("/addPrefix")
public String addPrefix(@RequestParam("name") String name);
}
2.1 导入依赖
生产者和消费者都导入相关依赖
这是高版本使用
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<!-- 仅当 Zookeeper Server 版本是 3.4.x 及以下时,使用此依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-zookeeper-spring-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<!-- 仅当 Zookeeper Server 版本是 3.5.x 及以上时,使用此依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-zookeeper-curator5-spring-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
-->
或者使用下面的配置,注意低版本需要自己维护duboo与zookeeper版本
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!-- rpc协议-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-rpc-dubbo</artifactId>
</dependency>
<!-- zookeeper注册-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>3.3.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.2 公共的接口服务
接口代码
public interface IProductInfoService {
ProductInfoVO getProductInfo(Integer productId);
}
2.3 生产者代码以及配置
server:
port: 8081
dubbo:
application:
name: dubbo3-producer-serv #应用名称,要求不重复
registry:
address: zookeeper://192.168.137.140:2181?backup=192.168.137.139:2181 #注册中心地址
register-mode: instance # 新用户请设置此值,表示启用应用级服务发现,可选值 interface、instance、all,默认值为 all,未来版本将切换默认值为 instance
# username: root
# password: 123456
protocol:
name: dubbo #rpc协议
# port: 20880 #rpc端口
port: -1 #rpc端口
代码,@EnableDubbo
开启dubbo
@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.wz.producer")
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class, args);
}
}
注意这个IProductInfoService
是接口服务中的
@DubboService(version = "1.0.0")
public class ProductInfoServiceImpl implements IProductInfoService {
@Override
public ProductInfoVO getProductInfo(Integer productId) {
ProductInfoVO productInfoVO = new ProductInfoVO();
BeanUtils.copyProperties(getProductInfoMapper(productId), productInfoVO);
return productInfoVO;
}
private ProductInfo getProductInfoMapper(Integer productId) {
ProductInfo productInfo = new ProductInfo();
productInfo.setProductId(productId);
productInfo.setProductName("产品1");
return productInfo;
}
}
2.4 消费者代码以及配置
server:
port: 8080
servlet:
context-path: /consumer
dubbo:
application:
name: dubbo3-consumer-serv #应用名称
qos-port: 22223 # 解决org.apache.dubbo.qos.server.QosBindException: qos-server can not bind localhost:22222 问题
registry:
address: zookeeper://192.168.137.140:2181?backup=192.168.137.139:2181 #注册中心地址
# username: root
# password: 123456
consumer:
check: false #启动时检查
timeout: 30000 #rpc调用的超时时间
retries: 2 #调用失败后的重试次数
代码,@EnableDubbo
开启dubbo代码,
@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.wz.consumer")
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
@DubboReference(version = "1.0.0")
指定版本号,注入的IProductInfoService
也是接口服务中的
@Service
public class OrderInfoServiceImpl implements IOrderInfoService {
@DubboReference(version = "1.0.0")
private IProductInfoService productInfoService;
@Override
public OrderInfoVO getOrderInfo(Integer orderId) {
OrderInfo orderInfo = getOrderInfoMapper(orderId);
OrderInfoVO orderInfoVO = new OrderInfoVO();
BeanUtils.copyProperties(orderInfo, orderInfoVO);
// 根据产品id获取产品信息
ProductInfoVO productInfoVO = productInfoService.getProductInfo(orderInfo.getProductId());
BeanUtils.copyProperties(productInfoVO, orderInfoVO);
return orderInfoVO;
}
// 模拟mapper层的数据
private OrderInfo getOrderInfoMapper(Integer orderId) {
OrderInfo orderInfo = new OrderInfo();
orderInfo.setOrderId(orderId);
orderInfo.setProductId(1);
return orderInfo;
}
}
controller层代码
@RestController
public class OrderInfoController {
@Resource
private IOrderInfoService orderInfoService;
@GetMapping("/getOrderInfo")
public OrderInfoVO getOrderInfo(@RequestParam(required = true, value = "orderId") Integer orderId) {
return orderInfoService.getOrderInfo(orderId);
}
}
3. 服务治理功能
参考链接,https://blog.csdn.net/weixin_45404884/article/details/137697450