SpringCloud整合Dubbo

通常来说,RPC协议比REST具有更好的性能。很多开发人员希望享受Spring Cloud的生态,同时有兼顾PRC的效率的效率。SpringCloud Alibaba很好的解决了这个问题。

1.为什么整合dubbo?

Feign基于Http协议(应用层),在高并发场景下性能不够理想,容易成为性能瓶颈, Dubbo框架的通信协议采用TCP协议(数据传输层)。

SpringCloud整合Dubbo_第1张图片

 Dubbo框架的通信协议采用RPC协议,属于传输层协议; Dubbo默认通过Netty构造TCP长连接的方式进行通信,性能较高; 使用SpringCloud整合Dubbo,即为强强联合。

2.springboot整合dubbo

通常来说,RPC协议比REST具有更好的性能。很多开发人员希望享受Spring Cloud的生态,同时有兼顾PRC的效率的效率。SpringCloud Alibaba很好的解决了这个问题。

2.1功能概述

将Dubbo集成至SpringCloud主要是替换Ribbo或者Feign实现远程调用。加入Dubbo后,整体的架构如下:

SpringCloud整合Dubbo_第2张图片

 2.2入门案例

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。

你可能感兴趣的:(java技术,微服务,spring,cloud,dubbo,java)