
1、什么是Dubbo3Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。Dubbo3 已在阿里巴巴内部微服务集群全面落地成功取代运行多年的 HSF 框架。2、构建Dubbo3脚手架2.1 框架依赖MavenSpringCloud 2.6.11Dubbo 3.1.8 zookeeper 3.4.142.2 搭建Zookeeper解压修改zk的配置文件进入conf将文件zoo_sample.cfg 改为zoo.cfg测试zk启动zookeeper执行zookeeper根目录下bin文件中的zkServer.cmd上面的CMD窗口不要关闭这样zookeeper就是出于运行状态了2.3 创建工程2.3.1 创建父工程mdb-dubbo-ann父工程控制版本:?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.6.11/version relativePath/ !-- lookup parent from repository -- /parent modules moduledubbo-consumer/module moduledubbo-provider/module moduledubbo-common/module /modules groupIdcom.msb/groupId artifactIdmsb-dubbo-ann/artifactId version0.0.1-SNAPSHOT/version namemsb-dubbo-ann/name packagingpom/packaging descriptionDemo project for Spring Boot/description properties java.version1.8/java.version dubbo-version3.1.8/dubbo-version /properties dependencies dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-spring-boot-starter/artifactId version${dubbo-version}/version /dependency dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-rpc-dubbo/artifactId version${dubbo-version}/version /dependency dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-registry-zookeeper/artifactId version${dubbo-version}/version /dependency /dependencies /dependencyManagement /project 2.3.2 创建提供者dubbo-provider引入依赖dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-spring-boot-starter/artifactId /dependency dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-rpc-dubbo/artifactId /dependency dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-registry-zookeeper/artifactId /dependency增加配置server: port: 8002 logging: config: classpath:logback.xml dubbo: application: name: dubbo-provider protocol: name: dubbo #客户端链接20880就可以访问我们的dubbo port: 20883 registry: address: zookeeper://127.0.0.1:2181更改主类import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; // 因为是自动装配也可以不加这个注解 EnableDubbo(scanBasePackages com.msb.dubbo.provider.service) SpringBootApplication public class DubboProviderApplication { public static void main(String[] args) { SpringApplication.run(DubboProviderApplication.class); } }接着增加通信端口public interface IUserService { User getUserById(Long id); }Data AllArgsConstructor Builder public class User implements Serializable { private static final long serialVersionUID 1L; private Long id; private String name; private int age; }增加实现类DubboService// 定义一个dubbo服务 public class UserServiceImpl implements IUserService { Override public User getUserById(Long id) { User user User.builder().id(id) .age(12) .name(天涯) .build(); return user; }2.3.3 创建客户端引入依赖!--这里是dubbo和SpringBoot桥梁的整合-- dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-spring-boot-starter/artifactId /dependency !--每一种协议都会对应的一个jar比方dubbo、rest、tripe 三种协议-- dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-rpc-dubbo/artifactId /dependency !--注册中心可以是zk,nacos -- dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-registry-zookeeper/artifactId /dependency更改配置server: port: 8001 logging: config: classpath:logback.xml dubbo: application: name: dubbo-consumer registry: address: zookeeper://127.0.0.1:2181更改主类EnableDubbo SpringBootApplication public class DubboConsumeApplication { public static void main(String[] args) { SpringApplication.run(DubboConsumeApplication.class); } }增加调用接口public interface IUserService { User getUserById(Long id); }Data AllArgsConstructor Builder public class User implements Serializable { private static final long serialVersionUID 1L; private Long id; private String name; private int age; }增加业务调用处理RestController public class OrderController { Autowired private OrderService orderService; RequestMapping(/createOrder/{userId}) public String createOrder(PathVariable(userId) Long userId){ return orderService.createOrder(userId); } }Slf4j Service public class OrderService { // 引用对应的dubbo服务 DubboReference private IUserService iUserService; public String createOrder(Long userId){ User user iUserService.getUserById(userId); log.info(用户用户信息{},user); return 创建订单成功; } }2.3.4 测试http://localhost:8001/createOrder/2322.3.5 重构创建公共模块dubbo-common 存放IUserService 和User提供端和消费端dependency groupIdcom.msb/groupId artifactIddubbo-common/artifactId version0.0.1-SNAPSHOT/version /dependency2.3.6 测试http://localhost:8001/createOrder/2322.4 开启rest协议如果我们的服务希望既要支持dubbo协议调用也要能支持http调用所以要么仍然保留SpringMVC那一套如果不想保留那一套就可以开启 dubbo中的rest协议。2.4.1 增加依赖dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-rpc-rest/artifactId /dependency2.4.2 更改配置dubbo: application: name: dubbo-provider # 这里的协议加了s,所以可以设置多个通信协议 protocols: p1: name: dubbo #客户端链接20883就可以访问我们的dubbo port: 20883 p2: name: rest #客户端链接20884就可以访问我们的rest port: 208842.4.3 更改对应代码服务DubboService// 定义一个dubbo服务 Path(/user) public class UserServiceImpl implements IUserService { GET Path(/{userId}) Produces(MediaType.APPLICATION_JSON) Override public User getUserById(PathParam(userId) Long userId) { User user User.builder().id(userId) .age(12) .name(天涯) .build(); return user; } }2.4.4 测试在消费端增加RestTemplateEnableDubbo SpringBootApplication public class DubboConsumeApplication { Bean public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(DubboConsumeApplication.class); } }Slf4j Service public class OrderService { DubboReference private IUserService iUserService; Autowired RestTemplate restTemplate; public String createOrder(Long userId){ User user restTemplate.getForObject(http://localhost:20884/user/232,User.class); log.info(用户用户信息{},user); return 创建订单成功; } }http://localhost:8001/createOrder/2322.4.5 使用接口调用Rest将rest协议放到common中dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-rpc-rest/artifactId /dependency修改IUserServicePath(/user) public interface IUserService { GET Path(/{userId}) Produces(MediaType.APPLICATION_JSON) User getUserById(PathParam(userId) Long id); }修改consume里面内容Slf4j Service public class OrderService { // 指定写协议 DubboReference(protocol rest) private IUserService iUserService; Autowired RestTemplate restTemplate; public String createOrder(Long userId){ User user iUserService.getUserById(userId); log.info(用户用户信息{},user); return 创建订单成功; } }如果我们不能确定是否是走的http我们可以DispatcherServlet#service 里面打个端点看是否进入