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/
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命令。打包成功后出现如下界面。
执行java -jar dubbo-admin-0.0.1-SNAPSHOT.jar 启动成功后
通过浏览器打开http://localhost:7001/governance/applications出现监控中心界面如下,安装成功
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上手实践的主要内容,如果未能解决你的问题,请参考以下文章
keras快速上手-基于python的深度学习实践_第8章_文字生成源代码
Dubbo Spring Boot 最佳实践整合 Demo 征集