使用zookeeper的原因
对于多服务集群,地址的维护相当麻烦。对于不同客户端都需要维护。dubbo利用zookeeper作为注册中心实现动态维护。

项目启动报错发现缺少slf4j添加slf4j相关依赖即可。

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
zookeeper启动配置,启动项目发现报错。
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy

pom.xml中引入依赖zookeeper客户端连接相关依赖
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
zookeeper连接工具地址:zookeeperView
插曲: 启用用windows的zookeeper现注册出现部分问题。可能是因为zookeeper conf目类下zoo.cfg需要把dataDir目类更改为本机存储地址,即可。

服务消费者:
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 服务名称 唯一便于之后查找 owner : 所有者 organization : 组织-->
<dubbo:application name="pay-service" owner="yan" organization="anna"/>
<!-- 配置注册中心 先不用设置为空 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:reference interface="com.fightingan.dev.IPayService"
id="pay-server"/>
</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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 服务名称 唯一便于之后查找 owner : 所有者 organization : 组织-->
<dubbo:application name="order-service" owner="yan" organization="anna"/>
<!-- 配置注册中心 先不用设置为空 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 通过哪个协议 端口号是多少 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!--发布服务接口为服务 ref 为实现类-->
<dubbo:service interface="com.fightingan.dev.IPayService" ref="payService"/>
<bean id="payService" class="com.fightingan.dev.impl.PayServiceImpl"/>
</beans>
此时Zookeeper节点情况:

Dubbo提供的启动类,它会启动Dubbo中配置的多个container
package com.fightingan.dev;
import org.apache.dubbo.container.Main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
* @author 30378
*/
public class App
{
public static void main( String[] args ) throws IOException {
Main.main(args);
}
}
Dubbo 主要支持Log4j、Logback,SpringContainer三个容器。

如果多个服务来自不同的注册机,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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 服务名称 唯一便于之后查找 owner : 所有者 organization : 组织-->
<dubbo:application name="order-service" owner="yan" organization="anna"/>
<!-- 配置注册中心 先不用设置为空 -->
<dubbo:registry id="rg1" address="zookeeper://127.0.0.1:2181"/>
<dubbo:registry id="rg2" address="zookeeper://192.168.0.131.1:2181"/>
<!-- 通过哪个协议 端口号是多少 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!--发布服务接口为服务 ref 为实现类-->
<dubbo:service interface="com.fightingan.dev.IPayService" ref="payService" registry="reg1"/>
<dubbo:service interface="com.fightingan.dev.IQueryProvide" ref="queryString" registry="reg1"/>
<bean id="payService" class="com.fightingan.dev.impl.PayServiceImpl"/>
<bean id="queryString" class="com.fightingan.dev.impl.QueryStringImpl"/>
</beans>
支持的注册中心比较多:

如果想要使用不同协议

直接修改这个即可。
协议支持
Dubbo的理解:是一个生态 -> 是一个平台
1、支持各种注册中心
2、支持多协议
webservice 为短连接
例如:使用Dubbo支持webservice pom.xml依赖需要引入:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-simple</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.3.2</version>
</dependency>
http 服务需要用到服务器:(使用到 Jetty service 和 Jetty servlet ),需要引入依赖:
<!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.4.21.v20190926</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-servlet -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.4.21.v20190926</version>
</dependency>
支持webservice ,服务器jetty,发布端口时需要定义服务,protocol = "webservice"

jetty默认为80端口


支持多种注册中心:

rpc远程通信协议:

使用Rest发布服务,需要添加此两个依赖:
<!-- 使用 rest 交互 JARX—RS CXF/Jersey/RESTEasy dubbo 基于 RESTEasy 实现-->
<!-- https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-jaxrs -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.8.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-client -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>4.0.0.Final</version>
</dependency>
发布接口需要指定rest风格:
...
<dubbo:protocol name="rest" port="8888" server="jetty"/>
<!--发布服务接口为服务 ref 为实现类-->
<dubbo:service interface="com.fightingan.dev.IPayService" ref="payService"
protocol="dubbo,rest" registry="reg1"/>
...
接口示例:
package com.fightingan.dev;
import org.jboss.resteasy.annotations.jaxrs.PathParam;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
/**
* @author 30378
*/
@Path("/pay")
public interface IPayService {
/**
* 暴漏出去的服务
**/
@GET
@Path("/{info}")
String pay(@PathParam("info") String info);
}
Dubbo 服务监控软件:
解决telnet不是本地服务:


可以使用telnet 连接dubbo发布的服务