Spring Boot & Dubbo

Scroll Down

Spring Boot & Dubbo

在spring boot中整合Dubbo,Dubbo的整合在Spring 中和spring boot中有些不一样

创建两个新项目,都是Spring boot项目,其中Consumer的项目中是一个web项目,加入spring boot的web支持

添加依赖

Dubbo 已经给我们写好了Spring Boot的Starter

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>

里面已经内置了dubbo等模块

我们就不用自己手动添加zookeeper和dubbo了

公共api

在项目中新建API模块,取名service-api,这是一个maven项目,里面存放的内容有

  1. Bean
  2. Service的接口
  3. ...等公共的部分

Dubbo的入门一样,这里就不多赘述了

服务提供者部分

编写com.dubboLearn.service.impl下的UserServiceImpl

这里的编写基本和入门时一样

public class UserServiceImpl implements UserService {

    public static Map<String,User> userMap;
    static {
        userMap = new HashMap<String, User>();
        userMap.put("1",new User("1","lucas"));
    }
    public User findUserById(String id) {
        return UserServiceImpl.userMap.get(id);
    }

}

配置yaml

众所周知,xml中能够进行配置的yaml中也能进行配置

dubbo:
  application:
    name: provider
  registry:
    protocol: zookeeper
    address: 127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20880
  monitor:
    protocol: registry

我们还差配置暴露哪个服务让别人引用

在UserServiceImpl 上使用注解

@Service
@Component
public class UserServiceImpl implements UserService {

    public static Map<String,User> userMap;
    static {
        userMap = new HashMap<String, User>();
        userMap.put("1",new User("1","lucas"));
    }
    public User findUserById(String id) {
        return UserServiceImpl.userMap.get(id);
    }

}

注意这里的Service

必须是,不要和Spring 的Service搞混

com.alibaba.dubbo.config.annotation.Service

最后在主程序上使用注解

@EnableDubbo
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

这样服务就进行了注册

消费者部分

和刚刚一样,创建一个Spring boot项目,添加web支持,导入依赖

编写OrderService,这里的@Service注解是Spring的

@Service
public class OrderServiceImpl implements OrderService {

    @Reference
    private UserService userService;

    public UserService getUserService() {
        return userService;
    }

    
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void addOrder() {
        User user = userService.findUserById("1");
        if (user!=null)
            System.out.println(user.getUserName()+"订购了一些东西");
    }
}

配置yaml

server:
  port: 8083
dubbo:
  application:
    name: consumer
  registry:
    protocol: zookeeper
    address: 127.0.0.1:2181
  monitor:
    protocol: registry

里面配置的要远程调用的接口在Serivce中配置

@Reference

编写Controller

@RestController
public class ConsumerController {

    @Reference
    UserService userService;

    @Autowired
    OrderService orderService;

    @RequestMapping("/consume")
    public String consume()
    {
        orderService.addOrder();
        return null;
    }
}

我们先进行注入的第一次实验,如果控制台打印了正确的信息,那么说明远程调用成功

在启动之前别忘了给启动类加上@EnableDubbo

启动后控制台打印出了东西

此时再看到Dubbo Admin

image20200505183039351.png

也会显示一些信息

这时我们再更改Controller层的代码

@RequestMapping("/consume")
public String consume()
{
    User user = userService.findUserById("1");
    return user.getUserName()+"订购了一些东西";
}

重新启动服务器,再次访问

如果浏览器显示了对应的文字,那么访问就成功了

dubbo monitor

如果我们多次请求刚刚的页面,多次进行远程调用

并且稍微等一会,monitor中会出现分析图表

image20200505183724388.png

大概是这样的,可以看出monitor的作用