Dubbo
2019-08-07 20:15:59 yjn1995 阅读数 746
  • Dubbo项目实战

    本套Dubbo课程结合讲师多年的Dubbo应用实战经验,详细讲解Dubbo分布式服务框架的应用入门基础。

    16902 人正在学习 去看看 吴水成

什么是Dubbo

Apache Dubbo是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力:

  • 面向接口的远程方法调用
  • 智能容错和负载均衡
  • 服务自动注册和发现
    简单来说Dubbo就是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
    Dubbo 目前已经有接近30k的 Star ,Dubbo的Github 地址:https://github.com/apache/incubator-dubbo
    Dubbo 是由阿里开源,后来加入了 Apache 。正式由于 Dubbo 的出现,才使得越来越多的公司开始使用以及接受分布式架构。

为什么要用Dubbo

Dubbo的诞生和SOA分布式架构的流行有着莫大的关系。SOA 面向服务的架构(Service Oriented Architecture),也就是把工程按照业务逻辑拆分成服务层和表现层。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
SOA架构中有两个主要角色:服务提供者(Provider)和服务使用者(Consumer)。
在这里插入图片描述
如果要开发分布式程序,也可以直接基于 HTTP 接口进行通信,那为什么要用Dubbo呢?
我认为主要可以从Dubbo提供的下面四点特性来说明:

  • 负载均衡——同一个服务部署在不同的机器时该调用那一台机器上的服务
  • 服务调用链路生成——随着系统的发展,服务越来越多,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。Dubbo可以为我们解决服务之间互相是如何调用的
  • 服务访问压力以及时长统计、资源调度和治理——基于访问压力实时管理集群容量,提高集群利用率
  • 服务降级——某个服务挂掉之后调用备用服务

另外,Dubbo 除了能够应用在分布式系统中,也可以应用在现在比较火的微服务系统中。不过,由于Spring Cloud在微服务中应用更加广泛,所以,一般我们提 Dubbo 的话,大部分是分布式系统的情况。

我们刚刚提到了分布式这个概念,下面再给大家介绍一下什么是分布式?为什么要分布式?

什么是分布式?

分布式重要的就是面向服务,或者说简单的分布式就是我们把整个系统拆分成不同的服务然后将这些服务放在不同的服务器上减轻单体服务的压力提高并发量和性能。比如电商系统可以简单地拆分成订单系统、商品系统、登录系统等等,拆分之后的每个服务可以部署在不同的机器上,如果某一个服务的访问量比较大的话也可以将这个服务同时部署在多台机器上。

为什么要分布式?

从开发角度来讲单体应用的代码都集中在一起,而分布式系统的代码根据业务被拆分。所以,每个团队可以负责一个服务的开发,这样提升了开发效率。
此外,代码根据业务拆分之后更加便于维护和扩展。
还有,将系统拆分成分布式之后不光便于系统扩展和维护,更能提高整个系统的性能。

DUBBO
2019-09-02 11:30:12 likunpeng6656201 阅读数 179
  • Dubbo项目实战

    本套Dubbo课程结合讲师多年的Dubbo应用实战经验,详细讲解Dubbo分布式服务框架的应用入门基础。

    16902 人正在学习 去看看 吴水成

最近研究了一下阿里开源的分布式RPC框架dubbo,楼主写了一个 demo,体验了一下dubbo的功能。

快速开始
实际上,dubbo的官方文档已经提供了如何使用这个RPC框架example代码,基于 Netty 的长连接。楼主看这个框架主要是为了在微服务,service mesh大火的今天做一些技术储备以及了解一下分布式 RPC 框架的设计。

当然即便是写一个dubbo的demo也不能随便写写就好了,要认真对待说不定哪一天可以派上用场呢,下面是楼主写的代码的目录结构:
在这里插入图片描述
下面我来一一说明一下每个model的作用,

micro-service-dubbo-common是通用工具模块其他的model都需要依赖它 。
micro-service-dubbo-dal是整个项目的dao模块,有关数据库操作的相关代码都放在这里。
micro-service-dubbo-interface 是通用接口模块,专门用来声明接口,被consumer与provider同时依赖,这么做是为了项目的可拆分与分布式部署。
micro-service-dubbo-model是公用的实体类模块,不限于数据库对应的model,也可以放DTO,VO等。
micro-service-dubbo-provider项目的服务提供者。
micro-service-dubbo-web 项目的消费者,也是直接跟前端交互的controller层。
另外需要在pom文件中添加相关依赖

<!--dubbo-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>${dubbo.version}</version>
</dependency>

<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>${zkclient_version}</version>
</dependency>

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>${zookeeper_version}</version>
</dependency>

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>${curator_version}</version>
</dependency>

接口创建
既然是 RPC 服务,那就需要一个接口,再有一个实现类。在这里的接口定义是在我们的micro-service-dubbo-interface,具体实现是在provider这里创建,在楼主的项目中就是在micro-service-dubbo-provider中创建DemoService 的实现。

public interface DemoService {
    String sayHello(String name);

    public List getUsers();
}
@Service("demoService")
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext
                .getContext().getRemoteAddress());
        return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
    }

    @Override
    public List getUsers() {
        List list = new ArrayList();
        User u1 = new User();
        u1.setName("hejingyuan");
        u1.setAge(20);
        u1.setSex("f");

        User u2 = new User();
        u2.setName("xvshu");
        u2.setAge(21);
        u2.setSex("m");


        list.add(u1);
        list.add(u2);

        return list;
    }
}

然后consumer的 pom.xml 添加对这个接口的依赖,在这里的接口定义是在我们的consumer就是micro-service-dubbo-web。

<dependency>
  <groupId>com.whforever</groupId>
    <artifactId>micro-service-dubbo-provider</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>com.whforever</groupId>
    <artifactId>micro-service-dubbo-interface</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

有了接口,就需要配置一下。

接口配置
首先在提供方这里发布接口。创建一个 xml 文件,名为:dubbo-provider.xml。

文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- provider's application name, used for tracing dependency relationship -->
    <dubbo:application name="demo-provider"/>

    <!-- use multicast registry center to export service -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />

    <!-- use dubbo protocol to export service on port 20880 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- service implementation, as same as regular local bean -->
    <bean id="demoProviderService" class="com.whforever.service.impl.DemoServiceImpl"/>

    <!-- declare the service interface to be exported -->
    <dubbo:service interface="com.whforever.service.DemoService" ref="demoProviderService"/>

</beans>

很简单,发布了一个接口,类似 Spring 的一个 bean。

同样的,在consumer即micro-service-dubbo-web的 resource 文件下,也创建一个dubbo-consumer.xml文件。内容稍有不同。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- consumer's application name, used for tracing dependency relationship (not a matching criterion),
    don't set it same as provider -->
    <dubbo:application name="demo-consumer"/>

    <!-- use multicast registry center to discover service -->
    <!--<dubbo:registry address="multicast://224.5.6.7:1234"/>-->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />

    <!-- generate proxy for the remote service, then demoService can be used in the same way as the
    local regular interface -->
    <dubbo:reference id="demoConsumerService" check="false" interface="com.whforever.service.DemoService"/>

</beans>

从上面可以看出这两个文件的注册发现协议是zookeeper,因此在服务启动之前需要启动zookeeper,具体移步Zookeeper 注册中心安装启动

准备测试
测试之前还要做点点工作。

在启动provider事需要一部分引导程序,请看如下代码:

public class ProviderMain {
    public static void main(String[] args) throws IOException {
        System.setProperty("java.net.preferIPv4Stack", "true");
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("dubbo-provider.xml");
        context.start();

        System.in.read(); // press any key to exit
    }
}

consumer代码

@Controller
@RequestMapping("/")
public class IndexController {

    @Autowired
    DemoService demoService;

    @RequestMapping("/echo")
    @ResponseBody
    public String echo() {
        System.out.println(">>>>>>echo");
        return JSON.toJSONString(demoService.getUsers());
    }
}

运行
先运行provider:

[06/06/18 11:56:29:029 CST] main  INFO config.AbstractConfig:  [DUBBO] The service ready on spring started. service: com.whforever.service.DemoService, dubbo version: 2.6.1, current host: 192.168.1.120
[06/06/18 11:56:30:030 CST] main  INFO config.AbstractConfig:  [DUBBO] Export dubbo service com.whforever.service.DemoService to local registry, dubbo version: 2.6.1, current host: 192.168.1.120
[06/06/18 11:56:30:030 CST] main  INFO config.AbstractConfig:  [DUBBO] Export dubbo service com.whforever.service.DemoService to url dubbo://192.168.1.120:20880/com.whforever.service.DemoService?anyhost=true&application=demo-provider&bind.ip=192.168.1.120&bind.port=20880&dubbo=2.6.1&generic=false&interface=com.whforever.service.DemoService&methods=sayHello,getUsers&pid=13992&side=provider&timestamp=1528300589682, dubbo version: 2.6.1, current host: 192.168.1.120
[06/06/18 11:56:30:030 CST] main  INFO config.AbstractConfig:  [DUBBO] Register dubbo service com.whforever.service.DemoService url dubbo://192.168.1.120:20880/com.whforever.service.DemoService?anyhost=true&application=demo-provider&bind.ip=192.168.1.120&bind.port=20880&dubbo=2.6.1&generic=false&interface=com.whforever.service.DemoService&methods=sayHello,getUsers&pid=13992&side=provider&timestamp=1528300589682 to registry registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.6.1&pid=13992&registry=zookeeper&timestamp=1528300589673, dubbo version: 2.6.1, current host: 192.168.1.120
[06/06/18 11:56:30:030 CST] main  INFO transport.AbstractServer:  [DUBBO] Start NettyServer bind /0.0.0.0:20880, export /192.168.1.120:20880, dubbo version: 2.6.1, current host: 192.168.1.120

再运行sonsumer:
在这里插入图片描述
通过查看dubbo监控中心,可以看到如下所示的情况,具体dubbo监控中心如何安装部署请移步Simple 监控中心安装
在这里插入图片描述
小结
对于dubbo听其大名已久,直到最近才动手写了一些demo,总体来看上手还是比较简单,官方也提供了比较详细的文档,社区也比较活跃。

2019-08-01 14:19:54 qq_31091589 阅读数 902
  • Dubbo项目实战

    本套Dubbo课程结合讲师多年的Dubbo应用实战经验,详细讲解Dubbo分布式服务框架的应用入门基础。

    16902 人正在学习 去看看 吴水成

DUBBO-POSTMAN(dubbo接口测试,dubbo场景测试,dubbo集成测试)

dubbo-postman.png

DUBBO-POSTMAN: 一个用于通过web-ui页面访问dubbo接口的工具,灵感源于
postman

介绍

DUBBO-POSTMAN 是一个通过web页面访问dubbo接口的开源工具,包括零代码创建一个dubbo consumer,保存访问用例,构建场景测试.
核心功能如下.

  • 通过添加一个api的maven dependency即可创建一个dubbo consumer
  • webui页面自动生成dto的各个参数
  • 保存常用的请求作为用例
  • 根据保存的用例即可构建复杂的场景测试,极大减少回归测试的工作量
  • 开箱即用

DUBBO-POSTMAN UI

开发

基于vue+
element-ui+
vue-element-admin.

准备

下载源码到本地

git clone https://github.com/everythingbest/dubbo-postman.git
npm install --registry=https://registry.npm.taobao.org

本地调试

npm run dev

发布

npm run build

默认的ui地址是 http://localhost:9528/.
后台服务地址是 http://localhost:8080/.

DUBBO-POSTMAN BACKEND

首先需要确保代码已经下载到本地,后台的所有配置在项目的src/resource/application.properties文件里面

启动

在项目根目录下执行 maven clean package ,然后在命令行执行 java -jar target/dubbo-postman.jar

application.properties

项目的所有核心配置都在这个文件里面.

application.properties有三个主要配置.

  1. dubbo.api.jar.dir: maven-embedder构建的目录.
  2. nexus.url: 私服仓库地址.
  3. nodex.ip: redis哨兵配置.

使用演示

dubbo demo创建

创建服务

场景测试

注册中心添加

项目github地址

2016-09-09 17:03:30 qq_15017407 阅读数 6419
  • Dubbo项目实战

    本套Dubbo课程结合讲师多年的Dubbo应用实战经验,详细讲解Dubbo分布式服务框架的应用入门基础。

    16902 人正在学习 去看看 吴水成
  • telnet连接服务:

    [root@vm-10-112-88-162 ~]# telnet 10.112.88.162 20886
    Trying 10.112.88.162...
    Connected to 10.112.88.162.
    Escape character is '^]'.
    
    dubbo>
  • ls查看服务列表:

    dubbo>ls
    com.le.jr.trade.usercenter.interfaces.UserInterfaces
    com.le.jr.trade.usercenter.interfaces.UserExchangeCardInterfaces
    com.le.jr.trade.usercenter.interfaces.UserExportExcelInterfaces
    com.le.jr.trade.usercenter.interfaces.UserWoolPitFatherInterfaces
    com.le.jr.trade.usercenter.interfaces.UserBankInterfaces
    dubbo>ls com.le.jr.trade.usercenter.interfaces.UserInterfaces
    updateUserMask4One
    queryBankList
    sendMessage
    updateUserMask4Zero
    selectUserById
  • invoke调用服务:

    dubbo>invoke com.le.jr.trade.usercenter.interfaces.UserInterfaces.selectAllUserCount()
    {"message":null,"result":"SUCCESS","data":323330,"code":200}
    elapsed: 1414 ms.

Dubbo入门详细

阅读数 1886

没有更多推荐了,返回首页