Apache Dubbo Day2 对多种协议、注册中心的支持

350 阅读4分钟

使用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

github.com/HelloKittyN…

使用地址:blog.csdn.net/u010889616/…

插曲: 启用用windowszookeeper现注册出现部分问题。可能是因为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 主要支持Log4jLogbackSpringContainer三个容器。

如果多个服务来自不同的注册机,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 serviceJetty 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端口

http://localhost/com.fightingan.dev.IPayService?wsdl

支持多种注册中心:

支持多种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 服务监控软件:

github.com/apache/dubb…

解决telnet不是本地服务:

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