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项目,里面存放的内容有
- Bean
- Service的接口
- ...等公共的部分
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
也会显示一些信息
这时我们再更改Controller层的代码
@RequestMapping("/consume")
public String consume()
{
User user = userService.findUserById("1");
return user.getUserName()+"订购了一些东西";
}
重新启动服务器,再次访问
如果浏览器显示了对应的文字,那么访问就成功了
dubbo monitor
如果我们多次请求刚刚的页面,多次进行远程调用
并且稍微等一会,monitor中会出现分析图表
大概是这样的,可以看出monitor的作用