通常来说,RPC协议比REST具有更好的性能。很多开发人员希望享受Spring Cloud的生态,同时有兼顾PRC的效率的效率。SpringCloud Alibaba很好的解决了这个问题。
Feign基于Http协议(应用层),在高并发场景下性能不够理想,容易成为性能瓶颈, Dubbo框架的通信协议采用TCP协议(数据传输层)。
Dubbo框架的通信协议采用RPC协议,属于传输层协议; Dubbo默认通过Netty构造TCP长连接的方式进行通信,性能较高; 使用SpringCloud整合Dubbo,即为强强联合。
通常来说,RPC协议比REST具有更好的性能。很多开发人员希望享受Spring Cloud的生态,同时有兼顾PRC的效率的效率。SpringCloud Alibaba很好的解决了这个问题。
将Dubbo集成至SpringCloud主要是替换Ribbo或者Feign实现远程调用。加入Dubbo后,整体的架构如下:
1.定义接口模块dubbo-api,并将UserService接口抽取到此模块下。
package cn.it.dubbo.api;
import cn.it.dubbo.domain.User;
public interface UserService {
User queryById(Long id);
}
2.项目依赖
父工程加入SpringCloud Alibaba依赖。
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.5.RELEASE
pom
import
消费者和提供者引入nacos注册中心和Dubbo依赖。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-dubbo
cn.itcast
dubbo-api
1.0-SNAPSHOT
3.服务提供者
修改UserService实现UserApi接口。并使用@DubboService注解替换@Service对外暴露dubbo服务。
package cn.it.user.service;
import cn.it.dubbo.api.UserService;
import cn.it.dubbo.domain.User;
import cn.it.user.mapper.UserMapper;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
@DubboService
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
public User queryById(Long id) {
return userMapper.findById(id);
}
}
在application.yml中添加配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/dubbo-demo?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
#配置dubbo,注册中心,暴露的端口和协议,dubbo注解的包扫描
dubbo:
protocol:
name: dubbo
port: 20881
registry:
address: spring-cloud://localhost #使用SpringCloud中的注册中心
scan:
base-packages: cn.itcast.user.service #dubbo中包扫描
4.服务消费者
在OrderController中引入dubbo服务。调用UserService查询用户
package cn.it.order.controller;
import cn.it.dubbo.api.UserService;
import cn.it.dubbo.domain.Order;
import cn.it.dubbo.domain.User;
import cn.it.order.service.OrderService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private OrderService orderService;
@DubboReference
private UserService userService;
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
//根据id查询订单
Order order = orderService.queryOrderById(orderId);
//获取用户id
Long userId = order.getUserId();
//查询用户
User user = userService.queryById(userId);
//设置用户对象
order.setUser(user);
// 根据id查询订单并返回
return order;
}
}
在Order-service的模块中添加dubbo配置
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
#dubbo配置
dubbo:
registry:
address: spring-cloud://localhost #使用cloud的注册中心
consumer:
check: false #dubbo默认有启动检查
retries: 0 #dubbo内置的重试机制
至此,即完成springboot整合dubbo。