赞
踩
通常来说,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依赖。
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-alibaba-dependencies</artifactId>
- <version>2.2.5.RELEASE</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
消费者和提供者引入nacos注册中心和Dubbo依赖。
- <!--nacos注册中心的依赖-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- </dependency>
-
- <!--springcloud alibaba dubbo依赖 -->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-dubbo</artifactId>
- </dependency>
-
- <dependency>
- <groupId>cn.itcast</groupId>
- <artifactId>dubbo-api</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>

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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。