Springboot整合dubbo
声明:springboot的版本不同,比如1.5和2.0.x的版本,命名,依赖jar包,和书写方式是都发生了很大变化,
此处我是用的是2.0.1版本作整合的。
springboot整合dubbo项目结构:
springboot-dubbo-parent pom类型,定义公共的依赖信息
——springboot-dubbo-public-api-service pom类型,存放公共接口
————springboot-dubbo-api-member-service jar类型,会员服务提供接口
——springboot-dubbo-api-member-service-impl jar类型,会员服务接口的实现
——springboot-dubbo-order-web jar类型,订单项目调用会员项目
dubbo支持的协议:
springboot整合dubbo使用到了三个注解:
创建项目:
1.创建所有项目模块。
参考文档:https://blog.csdn.net/xuruanshun/article/details/102812536
2.父工程的pom文件:springboot-dubbo-parent
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.dayee</groupId> <artifactId>springboot-dubbo-parent</artifactId> <version>1.0-SNAPSHOT</version> <modules> <module>springboot-dubbo-public-api-service</module> <module>springboot-dubbo-api-member-service-impl</module> <module>springboot-dubbo-order-web</module> </modules> <packaging>pom</packaging> <!--springboot项目需要继承的依赖--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <!--版本信息及编码格式--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <curator-framework.version>4.0.1</curator-framework.version> <zookeeper.version>3.4.13</zookeeper.version> <dubbo.starter.version>0.2.0</dubbo.starter.version> </properties> <dependencies> <!--web依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--dubbo依赖--> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${dubbo.starter.version}</version> </dependency> <!--监控中心依赖--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>${curator-framework.version}</version> </dependency> <!--zookeeper依赖--> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>${zookeeper.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3.公共接口模块的pom文件:springboot-dubbo-public-api-service
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springboot-dubbo-parent</artifactId> <groupId>com.dayee</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <packaging>pom</packaging> <artifactId>springboot-dubbo-public-api-service</artifactId> <modules> <module>springboot-dubbo-api-member-service</module> </modules> </project>
4.服务提供者接口的pom文件:springboot-dubbo-api-member-service
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springboot-dubbo-public-api-service</artifactId> <groupId>com.dayee</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springboot-dubbo-api-member-service</artifactId> </project>
5.服务提供者接口实现类的pom文件:springboot-dubbo-api-member-service-impl
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springboot-dubbo-parent</artifactId> <groupId>com.dayee</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springboot-dubbo-api-member-service-impl</artifactId> <!-- 需要依赖服务提供者接口模块> <dependencies> <dependency> <groupId>com.dayee</groupId> <artifactId>springboot-dubbo-api-member-service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
6.服务消费者的pom文件:springboot-dubbo-order-we
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springboot-dubbo-parent</artifactId> <groupId>com.dayee</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springboot-dubbo-order-web</artifactId> <dependencies> <dependency> <groupId>com.dayee</groupId> <artifactId>springboot-dubbo-api-member-service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
7.在服务提供者接口模板springboot-dubbo-api-member-service中,写一个接口
package com.dayee.service; // 服务提供者——会员服务接口 public interface IMemberService { public String getUser(); }
8.在服务提供者接口实现类模块springboot-dubbo-api-member-service-impl中,添加实现接口
实现类接口MemberServiceImpl:
package com.dayee.service.impl; import com.alibaba.dubbo.config.annotation.Service; import com.dayee.service.IMemberService; @Service public class MemberServiceImpl implements IMemberService { // 1.dubbo采用注解方式发布服务,使用dubbo提供的@Service注解进行发布服务 // 2.dubbo提供的@Service注解是将该接口注册到注册中心上去 // 3.Spring提供的@Service注解是将该类注入到spring容器中 @Override public String getUser() { System.out.println("订单服务调用会员服务接口"); return "订单服务调用会员服务接口"; } }
注意:@Service注解,必须使用dubbo提供的依赖包(下面的),上面这个是spring提供的。
9.启动类AppMember
package com.dayee; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // 开启dubbo服务的注解 @EnableDubbo @SpringBootApplication public class AppMember { public static void main(String[] args) { SpringApplication.run(AppMember.class, args); } }
@EnableDubbo注解开始dubbo服务。
10.application.yml文件
#服务器端口号 server: port: 8080 #注册到注册中心的名称 dubbo: application: name: member #采用协议方式和端口号 protocol: #采用dubbo协议 name: dubbo #发布dubbo端口号为20880 port: 20880 #注册中心的地址 registry: address: zookeeper://127.0.0.1:2181 #实现类扫包范围 scan: base-packages: com.dayee.service.impl
11.在服务消费者模块springboot-dubbo-order-web中,调用服务提供者接口
调用接口的OrderController:
package com.dayee.controller; import com.alibaba.dubbo.config.annotation.Reference; import com.dayee.service.IMemberService; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class OrderController { @Reference private IMemberService memberService; @RequestMapping("/orderToMember") public String orderToMember() { return memberService.getUser(); } }
@Reference注解:dubbo提供的调用服务
12.启动类AppOrder:
package com.dayee.controller; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableDubbo @SpringBootApplication public class AppOrder { public static void main(String[] args) { SpringApplication.run(AppOrder.class, args); } }
13.application.yml文件
server: port: 8081 ###dubbo 注册服务名称 dubbo: application: name: order ###dubbo服务地址 protocol: name: dubbo port: 20880 registry: address: zookeeper://localhost:2181 consumer: timeout: 5000
14.启动
1)启动zookeeper,
2)启动springboot-dubbo-api-member-service-impl模块
3)启动springboot-dubbo-order-web模块
启动成功后,打开zookeeper客户端工具ZooInspector,发现已经注册到注册中心了。
15.浏览器访问http://localhost:8081/orderToMember
16.启动多台服务提供者:
修改springboot-dubbo-api-member-service-impl模块中的application.yml文件
修改服务器端口号和dubbo端口号。
修改MemberServiceImpl文件,把端口号显示出来,才能看到效果
再启动此模块的启动类,注意:不要关掉20880的那台,两台同时启动。
再次浏览器访问,dubbo会通过负载均衡,轮流访问两台服务器。