Springboot系列-整合dubbo

前言:关于dubbo,作为阿里巴巴开源的基于 Java 的高性能 RPC(远程调用)分布式服务框架,主要提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,这里不多说,详情请google…


1.为什么使用dubbo

日常所做项目架构基本都为单体架构,什么是单体架构呢,大致意思就是说只需要一个服务器,将程序进行打包发布,但是随着流量的增大,常规的垂直应用架构已无法应对,所以,架构就发生了变化,简单来说主要是为了解决下面几个问题:

  1. 当服务越来越多时,服务 URL 配置管理变得非常困难,负载均衡器等单点压力也越来越大
  2. 服务间依赖关系变得错踪复杂,无法清楚的描述或者管理架构关系
  3. 服务的调用量越来越大,服务的容量问题就暴露出来

因为dubbo作为ali开源的项目,因此其内部使用了Netty、Zookeeper等,保证了高性能高可用性,那么他与我们常说的springcloud有什么区别呢?

  1. 通信方式不同:Dubbo 使用的是 RPC 通信,而Spring Cloud 使用的是HTTP RESTFul 方式
  2. dubbo的服务注册中心为Zookeerper,服务监控中心为dubbo-monitor,无消息总线,服务跟踪、批量任务等组件;而spring-cloud的服务注册中心为spring-cloud netflix enruka,服务监控中心为spring-boot admin,有消息总线,数据流、服务跟踪、批量任务等组件;

2.dubbo核心功能
  1. Remoting:远程通讯,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式
  2. Cluster: 服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持
  3. Registry: 服务注册中心,基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器

3.dubbo架构

Springboot系列-整合dubbo_第1张图片

上图为dubbo官方架构图,强烈推荐,非常详细,对于每一层的详细介绍以及作用可以借鉴官网的说明,在此只对简单的架构做一个描述如下图所示:

Springboot系列-整合dubbo_第2张图片

其实上图其实相当于对上上图,也就是详细架构图做了一个封装,从大的方面来讲,consumer、provider、register、monitor代表了部署的节点,而在这些大的节点里面包含了许多的小模块,表示对其节点的内部业务逻辑处理;并且通过虚线可以看出他们之间可以相互进行远程调用,因为图只包含 RPC 的层,不包含 Remoting 的层,Remoting 整体都隐含在 Protocol 中

综上架构图顺便总结出如下几点:

  1. Dubbo不需要 Web 容器,如果硬要用Web 容器,只会增加复杂性,也浪费资源
  2. Dubbo 的服务容器只是一个简单的 Main 方法,并加载一个简单的 Spring 容器,用于暴露服务,所以Dubbo内置了Spring Container、Jetty Container、Jetty Container三种服务容器
  3. dubbo支持dubbo:// (推荐)、http://、http://、redis://、memcached://几种协议
  4. Dubbo里面节点角色有:provide:暴露服务的服务提供方、consumer:调用远程服务的服务消费方、registry:服务注册于发现的注册中心、monitor:统计服务调用次数和调用时间的监控中心、container:服务运行容器

4.dubbo实战

1.选择ZooKeeper作为注册中心

在linux环境中使用docker安装ZooKeeper

//拉取zookeeper镜像
docker pull zookeeper

//启动zookeeper
docker run -d -p 2181:2181 -v /mysoft/zookeeper/data/:/data/ --name=zookeeper --privileged zookeeper

2.创建maven项目统一声明接口,把所有接口提取到单独的项目,通过maven引入到其他项目

Springboot系列-整合dubbo_第3张图片
UserAddress.java

public class UserAddress implements Serializable {
    private Integer id;
    private String userAddress;
    private String userId;
   //省略getter,setter
}

OrderService.java

public interface OrderService {

    List initOrder(String id);

}

UserService

public interface UserService {

    List getAddress(String userId);

}

3.创建生产者SpringBoot项目

Springboot系列-整合dubbo_第4张图片

在pom.xml引入上文api接口项目,引入dubbo依赖


            com.api
            api
            1.0-SNAPSHOT
        

        
            com.alibaba.boot
            dubbo-spring-boot-starter
            0.2.0
        

实现UserService接口,作为dubbo的生产者需要用@Service注解,为了和spring的@Service注解区分,所以这里用的是@Component注解

UserServiceImpl.java

@Service
@Component
public class UserServiceImpl implements UserService {
    @Override
    public List getAddress(String userId) {
        UserAddress u1 = new UserAddress();
        u1.setId(1);
        u1.setUserAddress("TianJin");
        u1.setUserId("001");
        UserAddress u2 = new UserAddress();
        u2.setId(2);
        u2.setUserAddress("Peking");
        u2.setUserId("002");

        return Arrays.asList(u1,u2);
    }
}

启动类上用@EnableDubbo启用Dubbo注解

@EnableDubbo
@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

配置文件application.properties指定应用名称,注册中心,服务协议和端口号

dubbo.application.name=provider
dubbo.registry.address=zookeeper://你自己的主机IP:2181
dubbo.monitor.protocol=registry
dubbo.protocol.host=你自己的主机IP
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

之后启动程序,可以发现服务已经注册上去(问这个怎么看,可以自行google安装dubbo,在此不解)
Springboot系列-整合dubbo_第5张图片

4.创建消费者SpringBoot项目

Springboot系列-整合dubbo_第6张图片

pom.xml添加引入上文接口项目,引入dubbo依赖


            com.api
            api
            1.0-SNAPSHOT
        

        
            com.alibaba.boot
            dubbo-spring-boot-starter
            0.2.0
        

实现OrderServiece接口,这里的@Service是spring的,这里使用@Reference注解声明UserService是通过远程调用注入进来

OrderServiceImpl.java

@Service
public class OrderServiceImpl implements OrderService {

    @Reference
    UserService userService;
    @Override
    public List initOrder(String id) {
        List list = userService.getAddress(id);
        for(UserAddress u:list){
            System.out.println(u.getUserAddress());
        }
        return list;
    }
}

OrderController.java

@RestController
public class OrderController {

    @Autowired
    OrderService orderService;

    @GetMapping("/initOrder")
    public List initOrder(@RequestParam(name="id") String id){
        return orderService.initOrder(id);
    }
}

启动类@EnableDubbo启用Dubbo注解

@EnableDubbo
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

配置文件application.properties中声明服务名称,注册中心,以及tomcat对外端口号

dubbo.application.name=consumer
dubbo.registry.address=zookeeper://自己的主机IP:2181
dubbo.registry.protocol=zookeeper
dubbo.protocol.host=自己的主机IP
server.port=8081

最后url访问 localhost:8081/initOrder?userId=001即可访问provider提供的对应json数据,关于springboot整合dubbo实战,博主已经将完整的实战项目上传到github上了,需者可以自行下载,
下载地址:https://github.com/Wangxy9527/dubbo.git或者https://github.com/Wangxy9527/dubbo.git

.

你可能感兴趣的:(springboot系列,dubbo)