1.文档参照
2.三个工程
2.1 公共接口工程
参考这篇文章:SpringBoot整合Dubbo的第一种方式
2.2 服务提供者
首先我们注释掉配置文件中的相关内容,只留下应用名(不留也可以)。
spring.application.name=boot-user-service-provider #dubbo.application.name=boot-user-service-provider # #dubbo.scan.base-packages=com.szh.service.impl # #dubbo.registry.address=127.0.0.1:2181 #dubbo.registry.protocol=zookeeper # #dubbo.protocol.name=dubbo #dubbo.protocol.port=20880 # #dubbo.monitor.protocol=registry
package com.szh.service.impl; import com.szh.gmall.bean.UserAddress; import com.szh.gmall.service.UserService; import org.apache.dubbo.config.annotation.DubboService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; /** * 1.将服务提供者注册到注册中心 * 1) 引入dubbo依赖、zookeeper客户端依赖 * 2) 配置服务提供者 * 2.让服务消费者从注册中心订阅服务提供者的相关服务 */ @Service @DubboService(interfaceClass = UserService.class, version = "1.0.0") public class UserServiceImpl implements UserService { //The default value of ${dubbo.application.name} is ${spring.application.name} @Value("${spring.application.name}") private String applicationName; @Override public List<UserAddress> getUserAddressList(String userId) { UserAddress userAddress1 = new UserAddress(1, "浙江省杭州市", "1", "张三", "123456", "Y"); UserAddress userAddress2 = new UserAddress(2, "湖北省武汉市", "1", "李四", "999999", "N"); try { TimeUnit.MILLISECONDS.sleep(2000); //测试timeout // TimeUnit.MILLISECONDS.sleep(4000); //测试重试次数 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(applicationName + " old...."); return Arrays.asList(userAddress1, userAddress2); } }
这里其实还有UserService的第二个实现类,我这里就不给出代码了,可以参考上面链接的那篇文章。
下面我们主要给出第二种实现方式的核心:自定义Config配置类。
package com.szh.config; import com.szh.gmall.service.UserService; import org.apache.dubbo.config.*; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; /** * */ @Configuration public class MyDubboConfig { @Bean public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("boot-user-service-provider"); return applicationConfig; } @Bean public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setProtocol("zookeeper"); registryConfig.setAddress("127.0.0.1:2181"); return registryConfig; } @Bean public ProtocolConfig protocolConfig() { ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName("dubbo"); protocolConfig.setPort(20880); return protocolConfig; } //下面的配置可以替代 @DubboService 注解(也即注释掉这个注解,也可正常运行) @Bean public ServiceConfig<UserService> serviceConfig(@Qualifier("userServiceImpl") UserService userService) { ServiceConfig<UserService> serviceConfig = new ServiceConfig<>(); serviceConfig.setInterface(UserService.class); serviceConfig.setRef(userService); MethodConfig methodConfig = new MethodConfig(); methodConfig.setName("getUserAddressList"); methodConfig.setTimeout(1000); List<MethodConfig> methodConfigList = new ArrayList<>(); methodConfigList.add(methodConfig); serviceConfig.setMethods(methodConfigList); return serviceConfig; } }
主启动类上要加上关于Dubbo的包扫描注解。
package com.szh; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; @SpringBootApplication @EnableDubbo(scanBasePackages = "com.szh") public class BootUserServiceProviderApplication { public static void main(String[] args) { SpringApplication.run(BootUserServiceProviderApplication.class, args); } }
2.3 服务消费者
首先我们注释掉配置文件中的相关内容,只留下应用名(不留也可以)、端口号最好留下,因为服务提供者启动之后会占用8080,这里将服务消费者声明在8081端口启动。
server.port=8081 spring.application.name=boot-order-service-consumer #dubbo.application.name=boot-order-service-consumer # #dubbo.registry.address=zookeeper://127.0.0.1:2181 #dubbo.monitor.protocol=registry
下面我们还是通过controller的方式去访问调用服务提供者。
package com.szh.controller; import com.szh.gmall.bean.UserAddress; import com.szh.gmall.service.OrderService; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * */ @RestController public class OrderController { @Autowired private OrderService orderService; @GetMapping(value = "/initOrder/{userId}") public List<UserAddress> initOrder(@PathVariable("userId") String userId) { return orderService.initOrder2(userId); } }
package com.szh.service.impl; import com.szh.gmall.bean.UserAddress; import com.szh.gmall.service.OrderService; import com.szh.gmall.service.UserService; import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.Method; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * */ @Service public class OrderServiceImpl implements OrderService { @DubboReference(interfaceClass = UserService.class, //服务接口名 version = "1.0.0", //服务版本,与服务提供者的版本一致 check = false, //启动时检查提供者是否存在,true报错,false忽略 timeout = 3000, //服务方法调用超时时间(毫秒) methods = @Method(name = "getUserAddressList"), //精确到服务接口的某个方法 retries = 3) //远程服务调用重试次数,不包括第一次调用,不需要重试请设为0 private UserService userService; @Override public List<UserAddress> initOrder2(String userId) { System.out.println("用户id:" + userId); List<UserAddress> addressList = userService.getUserAddressList(userId); return addressList; } @Override public void initOrder(String userId) { } }
下面是核心的自定义Config配置类。
package com.szh.config; import com.szh.gmall.service.UserService; import org.apache.dubbo.config.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; /** * */ @Configuration public class MyDubboConfig { @Bean public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("boot-order-service-consumer"); return applicationConfig; } @Bean public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setProtocol("zookeeper"); registryConfig.setAddress("127.0.0.1:2181"); return registryConfig; } @Bean public MonitorConfig monitorConfig() { MonitorConfig monitorConfig = new MonitorConfig(); monitorConfig.setProtocol("registry"); return monitorConfig; } //下面这段代码可以替代 @DubboReference 注解 @Bean public ReferenceConfig<UserService> referenceConfig() { ReferenceConfig<UserService> referenceConfig = new ReferenceConfig<>(); referenceConfig.setInterface(UserService.class); referenceConfig.setVersion("1.0.0"); referenceConfig.setTimeout(3000); referenceConfig.setRetries(3); MethodConfig methodConfig = new MethodConfig(); methodConfig.setName("getUserAddressList"); List<MethodConfig> methodConfigList = new ArrayList<>(); methodConfigList.add(methodConfig); referenceConfig.setMethods(methodConfigList); return referenceConfig; } }
package com.szh; 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; @SpringBootApplication @EnableDubbo(scanBasePackages = "com.szh") public class BootOrderServiceConsumerApplication { public static void main(String[] args) { SpringApplication.run(BootOrderServiceConsumerApplication.class, args); } }
3.启动测试
启动服务提供者和消费者之前,要先将zookeeper开启,然后再将dubbo管控台打开。
我这里为了方便,就直接在windows下启动zookeeper了,dubbo管控台开不开无所谓。
参考https://blog.csdn.net/weixin_43823808/article/details/124494499