# spring-boot-starter-dubbo **Repository Path**: jhxx/spring-boot-starter-dubbo ## Basic Information - **Project Name**: spring-boot-starter-dubbo - **Description**: dubbo springboot支持 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 95 - **Created**: 2017-04-12 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #spring-boot-start-dubbo * Dubbo是阿里开发的一套分布式通讯框架,Spring-boot是业界比较火的微服务框架,两者可以进行结合实现分布式微服务 * 对于内部远程Rpc调用,可以借用Dubbo能力,达到服务治理的目的 ##例子 git: https://git.oschina.net/wuyu15255872976/dubbo-demo-parent.git ##增加feign protocol支持。 > 该协议主要是为了支持老项目可以消费springcloud提供的接口,并可以利用dubbo的服务发现,构建出一个springboot rest集群, > dubbo与springboot结合时,不需要dubbo再次导出rest服务。而是由springboot提供rest服务dubbo端只负责注册,构建服务目录。 添加以下maven ``` org.apache.httpcomponents httpclient org.springframework.cloud spring-cloud-starter-feign io.github.openfeign feign-httpclient ``` ###feign示例 ``` @Bean //服务端,多协议发布服务 public ServiceBean userServiceServiceBean(@Autowired UserService userService) { ServiceBean serviceBean = new ServiceBean(); serviceBean.setInterface(UserService.class); serviceBean.setRef(userService); serviceBean.setProtocols(Arrays.asList(new ProtocolConfig("dubbo"), new ProtocolConfig("feign", port))); return serviceBean; } @Bean //消费端,此种方式可以避免使用@Reference注解,保持与spring注解一致 public ReferenceBean userService() { ReferenceBean bean = new ReferenceBean(); bean.setInterface(UserService.class); return bean; } @FeignClient(path = "/user") public interface UserService { @RequestMapping(value = "{id}", method = RequestMethod.GET) User findOne(@PathVariable(value = "id") Integer id); @RequestMapping(value = "{id}", method = RequestMethod.DELETE) void delete(@PathVariable(value = "id") Integer id); @RequestMapping(value = "/", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) void save(@RequestBody User user); @RequestMapping(value = "/", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE) void update(@RequestBody User user); @RequestMapping(value = "/findAll", method = RequestMethod.GET) List findAll(); } ``` ##如何发布Dubbo服务 在Spring Boot项目的pom.xml中添加以下依赖: ``` com.alibaba spring-boot-starter-dubbo 1.4.5.SNAPSHOT org.springframework.boot spring-boot-starter-web 1.4.5.RELEASE ``` 在application.properties添加Dubbo的版本信息和客户端超时信息,如下: ``` #dubbo produce spring.dubbo.application.name=comment-provider spring.dubbo.registry.protocol=zookeeper spring.dubbo.registry.address=monkey:2181,127.0.0.1:2181 spring.dubbo.protocol.name=dubbo spring.dubbo.protocol.port=20880 spring.dubbo.scan=com.vcg.comment.service spring.dubbo.protocol.host=发布的hostname 在Spring Application的application.properties中添加spring.dubbo.scan即可支持Dubbo服务发布,其中scan表示要扫描的package目录 ``` spring boot启动 ``` @SpringBootApplication @EnableDubboAutoConfiguration public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 编写你的Dubbo服务,只需要添加要发布的服务实现上添加 @Service ,如下: ``` @Service(version = "1.0.0") public class CommentServiceImpl implements CommentService { @Override public String test() { return "hello"; } } 如果你不喜欢Dubbo的@Service注解,而是喜欢原生的Spring @Service注解,可以采用以下方式对外发布服务 @Configurable public class BeanConfiguration { MonitorConfig monitorConfig; @Autowire public void setMonitorConfig(MonitorConfig monitorConfig){ this.monitorConfig=monitorConfig; } @Bean public ServiceBean commentServiceServiceBean(CommentService commentService) { ServiceBean serviceBean = new ServiceBean<>(); serviceBean.setInterface(CommentService.class); //开启监控 serviceBean.setMonitor(monitorConfig); serviceBean.setRef(commentService); return serviceBean; } } ``` 在application.properties添加Dubbo的版本信息和客户端超时信息,如下: #dubbo consumer ``` spring.dubbo.application.name=comment-consumer spring.dubbo.registry.protocol=zookeeper spring.dubbo.registry.address=monkey:2181 spring.dubbo.scan=com.vcg 在Spring Application的application.properties中添加spring.dubbo.scan即可支持Dubbo服务发布,其中scan表示要扫描的package目录 ``` 引用Dubbo服务,只需要添加要发布的服务实现上添加 @Reference ,如下: ``` @Component public class UserController { @Reference(version = "1.0.0") private CommentService commentService; } ``` 如果你不喜欢@Reference注入服务,而是用@Autowired可以采用以下方式. ``` @Configurable public class BeanConfiguration { MonitorConfig monitorConfig; @Autowire public void setMonitorConfig(MonitorConfig monitorConfig){ this.monitorConfig=monitorConfig; } @Bean public ReferenceBean commentService(){ ReferenceBean commentServiceBean=new ReferenceBean<>(); commentServiceBean.setInterface(CommentService.class); commentServiceBean.setMonitor(monitorConfig); return commentServiceBean; } } ``` 引用Dubbo服务,引用以上服务: ``` @Component public class UserController { @Autowired private CommentService commentService; } ```