dubbo上手实践

Posted 等机会来敲门

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo上手实践相关的知识,希望对你有一定的参考价值。

dubbo是什么?学习dubbo要解决什么问题?

1)Dubbo 是阿里巴巴公司开源的一个高性能优秀的开源分布式服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。
2)对于业务繁杂的业务系统,业务复杂,没有很好的进行业务拆分,版本不断迭代导致代码结构混乱,版本测试周期长,开发困难,上线困难,如果上线测试遇到严重bug,只能进行版本回退,性能遇到瓶颈时顶多搭建负载均衡集群分流,当并发访问量到一定数量后,基本很难再有性能提升,做了负载均衡也无济于事。

分布式和集群区别(引用知乎形象图)

所以dubbo应运而生,通过把单个应用进行复杂业务进行拆分成一个个独立的子系统,在分布式的结构中,这些子系统统称为服务,由于单应用业务清晰,规模较小,所以有微服务一说。最典型的应用场景就是电商系统,把以往复杂单应用复杂系统拆分为用户服务、产品服务、订单服务、后台管理服务、数据分析服务等等,服务之间可以独立运行,也有依赖关系,主要是数据操作交互,服务之间就通过RPC的方式调用(以往我们都是http接口),什么是RPC,后续再做详细说明。

官方学习车牌号:
apache:http://dubbo.apache.org/zh-cn/docs/user/new-features-in-a-glance.html

github:https://github.com/apache/dubbo/

dubbo上手实践

Registry:注册中心 

Consuumer:服务消费者 

Provider:服务提供者 

Monitor:监控中心

注册中心:也就是我们服务提供者需要把服务注册到某个地方,动态地注册和发现服务,使服务的位置透明,这些接口服务可以通过注册中心暴露出来通服务消费者调用。

服务消费者:调用远程服务的服务消费方

服务提供者:暴露服务的服务提供方

监控中心:统计服务的调用次数和调用时间的监控中心

简单搭建dubbo服务

1)安装注册中心
https://github.com/apache/dubbo/tree/2.5.x/dubbo-simple
下载后解压工程,使用mvn clean package打包,前提是maven环境没问题,如果打包不成功,就慢慢用eclipse打开工程看看缺失
什么jar或者什么问题导致,我这边遇到的是就是maven_compiler_version改成3.6的,高版本和如果不加
${maven_compiler_version}死活打包都不成功。

打包之前看看自己注册中心用的是那种,这里我们先用默认的Multicast 注册中心,其他方式可以参考dubbo文档,
注册中心配置dubbo-monitor-simplesrcmain esourcesconfdubbo.properties中可看到dubbo.registry.address
dubbo.registry.address=multicast://224.5.6.7:1234 如果不是改成这种。

命令行cd到目录下面时,执行mvn clean package命令。打包成功后出现如下界面。
dubbo上手实践

执行java -jar dubbo-admin-0.0.1-SNAPSHOT.jar 启动成功后
通过浏览器打开http://localhost:7001/governance/applications出现监控中心界面如下,安装成功
dubbo上手实践

2)创建统一接口服务和一些公共类的封装api(user-service-api)应用
目的是减少代码冗余,举个例子,在电商系统中,用户服务这个UserService可能在订单服务,产品服务都会用到,对于这种就避免不要重新创建UserService可能导致不一致难以维护和增加工作量。

创建service,然后打成jar,后面服务消费者和服务提供者都会引入使用

public interface GreetingsService {
String sayHi(String name);
}

public interface PersonService {
String attributes() ;
}

3)创建服务提供者,向注册中心注册暴露接口服务
#接口服务
public class GreetingsServiceImpl implements GreetingsService {
@Override
public String sayHi(String name) {
return "hi, " + name;
}
}

#启动类
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {

public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"provider.xml"});
System.out.println("dubbo service started");
context.start();
System.in.read();
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

}

#provider.xml配置

<?xml version="1.0" encoding="UTF-8"?>


<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="first-dubbo-provider" />

<!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234?unicast=false"/>

<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />

<!-- 声明需要暴露的服务接口 ref指向服务的真正实现对象 -->
<dubbo:service interface="com.yueli.service.GreetingsService" ref="greetingsServiceImpl" />

<!-- 和本地bean一样实现服务 -->
<bean id="greetingsServiceImpl" class="com.yueli.demo.service.impl.GreetingsServiceImpl" />
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

#启动服务提供者,查看监控中心

4)创建服务消费者
#调用远程服务(特别注意注解Service引入的是spring的不是dubbo的,配置文件中用自动扫包方式)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.yueli.service.GreetingsService;
import com.yueli.service.PersonService;

@Service(“personService”)
public class PersonServiceImpl implements PersonService {

@Autowired
private GreetingsService greetingsService;

@Override
public String attributes() {
String saySomeThings=greetingsService.sayHi("dubbo");
return "属性:" + saySomeThings;
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

}

#启动应用(方式1,间接调用)
import java.io.IOException;

import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.yueli.service.PersonService;

@EnableDubboConfig
public class Application {
private static String zookeeperHost = System.getProperty(“zookeeper.address”, “127.0.0.1”);

@SuppressWarnings("resource")
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"consumer.xml"});
context.start();
PersonService service =context.getBean("personService", PersonService.class);
String message = service.attributes();
System.out.println(message);
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 按任意键退出
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

}

#启动应用(方式二,直接调用)
import java.io.IOException;

import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.yueli.service.GreetingsService;

@EnableDubboConfig
public class Application {
private static String zookeeperHost = System.getProperty(“zookeeper.address”, “127.0.0.1”);

@SuppressWarnings("resource")
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"consumer.xml"});
context.start();
GreetingsService service =context.getBean("greetingsService", GreetingsService.class);;
String message = service.sayHi("dubbo");
System.out.println(message);
try {
System.in.read();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 按任意键退出
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

}

#配置consumer.xml服务消费者远程调用

<?xml version="1.0" encoding="UTF-8"?>


<context:component-scan base-package=“com.yueli.consumer.service.impl”></context:component-scan>

<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
  • 1

<dubbo:application name=“first-dubbo-consumer”/>

<dubbo:registry address=“multicast://224.5.6.7:1234?unicast=false”/>

<dubbo:reference id=“greetingsService” interface=“com.yueli.service.GreetingsService” check=“false” />

#启动服务消费者,查看监控中心,查看控制台,远程RPC方式调用成功

之前一直懒没有把github用起来,要学的知识和工具和还很多,从入门到坚持。


以上是关于dubbo上手实践的主要内容,如果未能解决你的问题,请参考以下文章

响应式编程的实践

《Python编程快速上手》6.7实践项目代码

keras快速上手-基于python的深度学习实践_第8章_文字生成源代码

Dubbo Spring Boot 最佳实践整合 Demo 征集

keras快速上手-基于python的深度学习实践-基于索引的深度学习对话模型-源代码

dubbo源码实践-protocol层例子