创建服务接口模块

接口工程只提供接口,不提供实现,在后面的提供者和消费者中使用 在使用接口的模块中只需要写具体实现类,避免了在每个模块中重复编写接口

  1. 在接口中引入依赖包

    1. <dependency>
    2. <groupId>org.projectlombok</groupId>
    3. <artifactId>lombok</artifactId>
    4. <optional>true</optional>
    5. </dependency>
  2. 创建一个实体类,一定要实现Serializable接口,否则dubbo协议之间无法传输

    1. @Data
    2. @AllArgsConstructor
    3. public class User implements Serializable {
    4. private String name;
    5. }
  3. 创建接口

    1. public interface UserService {
    2. List<User> getAll();
    3. List<User> getAll2();
    4. }

创建服务提供者

  1. 引入依赖

    1. <!--引入创建的接口服务-->
    2. <dependency>
    3. <groupId>com.yls</groupId>
    4. <artifactId>common-api</artifactId>
    5. <version>1.0-SNAPSHOT</version>
    6. </dependency>
    7. <!--由于服务提供者不是web项目
    8. ,只需引入spring-boot-starter,不用引入spring-boot-starter-web-->
    9. <dependency>
    10. <groupId>org.springframework.boot</groupId>
    11. <artifactId>spring-boot-starter</artifactId>
    12. </dependency>
    13. <!--dubbo-->
    14. <dependency>
    15. <groupId>com.alibaba.boot</groupId>
    16. <artifactId>dubbo-spring-boot-starter</artifactId>
    17. <version>0.2.0</version>
    18. </dependency>
  2. 修改配置文件 ```java

    服务名称

    dubbo.application.name=provider1

    注册中心地址

    dubbo.registry.address=39.97.234.52:2181,39.97.234.52:2182,39.97.234.52:2183

    注册中心类型

    dubbo.registry.protocol=zookeeper

版本号

dubbo.application.version=3

Dubbo Protocol

协议名称

dubbo.protocol.name=dubbo

服务暴露端口

dubbo.protocol.port=20880

  1. 3. 实现服务接口
  2. ```java
  3. //暴露服务
  4. //这里的@Service是Dubbo提供的,不是spring中的
  5. //version必填
  6. @Service(version = "${dubbo.application.version}")
  7. @Component
  8. public class UserImpl implements UserService {
  9. @Override
  10. public List<User> getAll() {
  11. User user1 = new User("张三");
  12. User user2 = new User("lisi");
  13. List<User> list = Arrays.asList(user1, user2);
  14. return list;
  15. }
  16. }
  1. 启动服务

    1. //@EnableDubbo等价于在配置文件中配置dubbo.scan.base-packages
    2. //扫描实现类所在的包,注册Bean
    3. @EnableDubbo
    4. @SpringBootApplication
    5. public class ProviderApplication {
    6. public static void main(String[] args) {
    7. SpringApplication.run(ProviderApplication.class,args);
    8. }
    9. }

创建消费者

  1. 引入依赖

    1. <!--消费者是web项目-->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-web</artifactId>
    5. </dependency>
    6. <!--dubbo-->
    7. <dependency>
    8. <groupId>com.alibaba.boot</groupId>
    9. <artifactId>dubbo-spring-boot-starter</artifactId>
    10. <version>0.2.0</version>
    11. </dependency>
    12. <!--引入创建的接口服务-->
    13. <dependency>
    14. <groupId>com.yls</groupId>
    15. <artifactId>common-api</artifactId>
    16. <version>1.0-SNAPSHOT</version>
    17. </dependency>
  2. 修改配置文件

    1. #注册中心
    2. dubbo.registry.address=39.97.234.52:2181,39.97.234.52:2182,39.97.234.52:2183
    3. dubbo.registry.protocol=zookeeper
    4. #dubbo应用名称
    5. dubbo.application.name=consumer1
  3. 实现消费接口

    1. //服务消费者的Service是spring的
    2. @Service
    3. public class OrderImpl implements OrderService {
    4. //使用dubbo提供的@Reference访问远程服务
    5. //version对应服务提供者的version
    6. @Reference(version = "3")
    7. private UserService userService;
    8. @Override
    9. public List<User> init() {
    10. List<User> list = userService.getAll();
    11. list.forEach(item -> System.out.println(item.getName()));
    12. return list;
    13. }
    14. }
  4. 创建controller

    1. @Controller
    2. public class OrderController {
    3. @Autowired
    4. private OrderService orderService;
    5. @ResponseBody
    6. @RequestMapping("/init")
    7. public List<User> init() {
    8. return orderService.init();
    9. }
    10. }
  5. 启动服务消费者

    1. @EnableDubbo
    2. @SpringBootApplication
    3. public class ConsumerApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(ConsumerApplication.class, args);
    6. }
    7. }

dubbo相关补充

  1. dubbo使用本地缓存方式,如果注册中心全部宕机,dubbo也能正常工作,就算没有注册中心,dubbo也能通过dubbo直连通信
    1. //使用dubbo提供的@Reference访问远程服务
    2. //version对应服务提供者的version
    3. //url:如果没有注册中心,可以通过url配置服务提供者的dubbo协议端口,进行dubbo直连
    4. @Reference(version = "3",url ="127.0.0.1:20880" )
    5. private UserService userService;