什么是dubbo
简单理解,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求。官方说Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)
为什么用dubbo
官网解释如下:
在大规模服务化之前,应用可能只是通过 RMI 或 Hessian 等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过 F5 等硬件进行负载均衡。
当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。 此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover,降低对 F5 硬件负载均衡器的依赖,也能减少部分成本。
当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。 这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。
接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器? 为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。
什么是Zookeeper
zookeeper是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。zookeeper可以作为dubbo服务的注册中心,两者结合起来可以实现微服务中的 服务注册、发现、负载均衡和健康检查,容错,动态配置管理的功能
为什么使用Zookeeper
Zookeeper可以提供配置管理、命名服务、分布式算法、集群管理功能。具体说明参看如下文章:
zookeeper集群搭建
请参考:这里写链接内容
Dubbo注册和使用服务的两种方式
服务提供端和服务消费端所需依赖是一样的,都需要在pom文件中引入dubbo、zookeeper、curator-client(或zkclient)的引用
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
1、代码注解的方式
服务提供者端
<?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.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
">
<!-- 应用信息,用于计算依赖关系 -->
<dubbo:application name="examinationEvaluationservice"/>
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" register="${dubbo.registry.register}"/>
<dubbo:protocol name="dubbo" port="20891"/>
<!-- 在配置文件中加上<dubbo:annotation>,是dubbo的扫描标签,它除了会扫描带有
'@Component'、'@Service'、'@Controller'注解的类,把它们注册成SpringBean之外,
它还会扫描带有”@Service” (dubbo的service标签)的接口实现类发布服务(必须有实现接口,不然或抛出BeanCreationException异常)
。同时在要发布服务的接口实现类上加上”@Service” (dubbo的service标签)。启动服务器,服务就发布成功了。-->
<dubbo:annotation package="com.dmsdbj.itoo.examinationEvaluation.facade"/>
<dubbo:annotation package="com.dmsdbj.itoo.examinationEvaluation.service"/>
<dubbo:provider timeout="300000" group="${dubbo.examinationEvaluation.group}"/>
</beans>
服务调用端
配置文件
<?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.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
">
<!-- 应用信息,用于计算依赖关系 -->
<dubbo:application name="examinationEvaluationservice"/>
<!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" register="${dubbo.registry.register}"/>
<!-- 再配置文件中加上<dubbo:annotation>,它会扫描所有注册bean的java类,发现带”@Reference”标签的属性,
它会去寻找发布的provider是否有匹配的接口,有就自动注入。 -->
<dubbo:annotation package="com.dmsdbj.itoo.examinationEvaluation.facade"/>
<dubbo:annotation package="com.dmsdbj.itoo.examinationEvaluation.service"/>
<dubbo:consumer check="false" timeout="300000" group="${dubbo.examinationEvaluation.group}"/>
</beans>
服务端调用
//这个注解表示从服务注册地址获取这个类型的服务
@Reference
private DictionaryFacade dictionaryFacade;
//使用@Reference获取到服务后,直接调用即可
//调用单表根据课程类型id的list查询课程类型名称
List<DictionaryEntity> dicList = dictionaryFacade.findNameByID(categoryIdList);
@Reference区别于@Autowired的地方是:
@Reference的包引用来自alibaba
@autowired的包引用来自springframework
2、xml配置方式:
服务提供者的服务逻辑不变,消费者的逻辑也不变,要变的是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"
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:application name="hello-world-app1"/>
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<dubbo:protocol name="dubbo" port="20881" />
<dubbo:service interface="com.yangs.test.service.DemoServer" ref="demoService" />
<bean id="demoService" class="com.yangs.test.service.impl.DemoServerImpl" />
</beans>
服务调用端
<?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:application name="consumer-of-helloworld-app" />
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService 通过配置实现 -->
<dubbo:reference id="demoService" interface="com.yangs.test.service.DemoServer" />
</beans>