java高级开发

Dubbo服务治理

2018-10-23  本文已影响3人  老鼠AI大米_Java全栈

dubbo源于电商系统,是由传统应用一步步演变而来,下面我们先了解下演变过程

系统演变过程

RPC(Remote Procedure Call Protocol):远程过程调用
RPC需要解决的问题

Dubbo特点

Dubbo架构

dubbo.png

服务启动及调用过程

下面我们开始搭建一个服务提供者与服务消费者。
主要是以下几个步骤:

  1. 安装Zookeeper,启动
  2. 创建maven项目,构建Dubbo+Zookeeper+Boot工程

安装zookeeper
因dubbo是基于zk的,所以要先启动zk。
下载zookeeper,将原配置文件zoo_sample.cfg重命名配置文件为zoo.cfg,再启动zkServer.cmd(windows下直接运行即可)

创建工程
在maven工程中创建如下几个module:

dubbo-api

public interface DubboService {
    //声明服务方法
    String sayHello(String name);
}

dubbo-consumer
配置文件consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    <!--配置服务名称-->
    <dubbo:application name="dubbo-consumer" />
    <!--配置服务注册中心,dubbo不仅仅支持zookeeper-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!--声明服务引用,与服务声明接口类型一致-->
    <dubbo:reference interface="com.iti.DubboService" id="dubboService" />
</beans>

引导文件,需要加载dubbo的配置文件

package com.iti;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@ImportResource("classpath:/consumer.xml")
@RestController
public class Consumer {
    //注入声明的服务
    @Autowired
    private DubboService dubboService;

    public  static void main(String[] args){
        SpringApplication.run(Consumer.class,args);
    }

    //测试服务调用
    @ResponseBody
    @RequestMapping("/sayhello/{name}")
    public String hello(@PathVariable String name){
        for(int i=0; i<10; i++){
            System.out.println(dubboService.sayHello(name+i));
        }
        return dubboService.sayHello(name);
    }
}

dubbo-provider
添加上面接口的具体实现,注意这里的value要与上面的id相同

@Component("dubboService")
public class DubboServiceImpl implements DubboService {

    @Override
    public String sayHello(String name) {
        return "hello " + name;
    }
}

同样也要对服务提供者配置dubbo,如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!--定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识-->
    <dubbo:application name="dubbo-provider" owner="programmer" organization="dubbox"/>
    <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!--使用 dubbo 协议实现定义好的 api.PermissionService 接口-->
    <dubbo:service interface="com.iti.DubboService" ref="dubboService" protocol="dubbo" />
</beans>

很多情况下,服务提供者也是服务消费者,怎么办?
可以在dubbo配置文件中直接配置对应的服务引用,如添加对DubboService2的引用

<dubbo:reference interface="com.iti.DubboService2" id="dubboService2" />

当然需要再创建一个服务提供者dubbo-provider2,步骤同上。

服务自动负载均衡
只需把dubbo-provider多启动几份(注意端口),这样针对DubboService接口的服务提供者就有多个,当调用服务消费者消费服务时,可以写一个循环打印服务接口的方法,就可以看到输出的日志已经负载均衡了。

学习交流群:64691032

上一篇下一篇

猜你喜欢

热点阅读