一、第一个Dubbo程序 

provider  目录结构

Dubbo和Dubbox简单使用

ProviderService类代码  提供服务的接口

public interface ProviderService {
    public String sayHello(String name);
    public List<String> getStrs();
}

ProviderServiceImpl代码   服务实现类

public class ProviderServiceImpl implements ProviderService {

    @Override
    public String sayHello(String name) {
        return "Hello "+ name;
    }

    @Override
    public List<String> getStrs() {
        List<String> lists=new ArrayList<String>();
        lists.add("hello");
        lists.add("world");
        return lists;
    }

}

StartDubboProvider类代码  启动dubbo

public class StartDubboProvider {
    public static void main(String[] args) throws Exception {
        //加载provider.xml 配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "provider.xml" });
        //启动 注册的服务
        context.start(); 
        System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟
    }
}

provider.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
        ">

    <!-- 具体的实现bean -->
    <bean id="providerService" class="com.xiaozhou.service.impl.ProviderServiceImpl" />

    <!-- 给应用起个名字    提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="firsrtprovider" />

    <!-- 使用zookeeper注册中心暴露服务地址    backup配的是zookeeper的备用地址 -->
    <dubbo:registry address="zookeeper://node22:2181?backup=node33:2181,node44:2181" />

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

    <!-- 声明需要暴露的服务接口  写操作可以设置retries=0 避免重复调用SOA服务 -->
    <dubbo:service retries="0" interface="com.xiaozhou.service.ProviderService" ref="providerService" />

</beans>

consumer 项目结构

Dubbo和Dubbox简单使用

ProviderService类代码  提供服务的接口   这个类要和provider中的ProviderSerivce一样 或者把provider项目打成jar包放到consumer项目中

public interface ProviderService {
    public String sayHello(String name);
    public List<String> getStrs();
}

TestConsumer 类代码     测试消费信息

public class TestConsumer {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "consumer.xml" });
        context.start();
        //得到提供服务的类
        ProviderService providerService=(ProviderService) context.getBean("consumerService");
        //调用服务的方法
        String sayHello = providerService.sayHello("张三");
        System.out.println(sayHello);
        List<String> list = providerService.getStrs();
        for (String string : list) {
            System.out.println(string);
        }
    }
}

consumer.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="consumer" />

    <dubbo:registry address="zookeeper://node22:2181?backup=node33:2181,node44:2181" />

    <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService 检查级联依赖关系 默认为true 当有依赖服务的时候,需要根据需求进行设置 -->
    <!-- interface  要和provider配置的一样 -->
    <dubbo:reference id="consumerService" check="false" interface="com.xiaozhou.service.ProviderService" />
</beans>

二、管理界面配置

1、解压dubbo-admin-2.5.4.war 文件    命令  unzip dubbo-admin-2.5.4.war  -d dubbo-admin

2、删除dubbo-admin-2.5.4.war  防止启动tomcat的时候  自动解压这个war包

3、修改dubbo-admin/WEB-INF/dubbo.properties  修改内容如下

#zookeeper 地址   监控配置的zookeeper下的dubbo服务  

#zookeeper 集群搭建参考https://my.oschina.net/xiaozhou18/blog/787132

dubbo.registry.address=zookeeper://node22:2181?backup=node33:2181,node44:2181

#登录管理界面用户名
dubbo.admin.root.password=root

#登录管理界面密码
dubbo.admin.guest.password=root

4、启动tomcat

5、在浏览器 输入 http://node22:8080/dubbo-admin/    出现如下图 表示管理界面配置成功

Dubbo和Dubbox简单使用

可以在这里对dubbo进行各种配置       可以把provider打成jar包放在多个服务器上对外提供服务

可以根据每台机器的性能手动设置  负载均衡  权重调节等

Dubbo和Dubbox简单使用

三、dubbo  xml中参数解释

retries   表示重试次数      默认是2次        

当请求dubbo服务时间太长或者失败 会进行多次重新请求  请求次数就是这个参数配的值    一般当写的操作时会将这个值设置成0  表示失败就失败了不进行重新请求  防止多次请求造成写入重复数据  

check  默认是true

表示一个provider 要依赖其他的provider的时候   true表示 启动provider的时候会检查要依赖的那个provider是否已经起来 如果没起来会报错      false 表示不检查

当一个provider 要依赖另一个provider的时候   在provider中配置

<!-- 注意这里,我们在使用DependencyService的时候,这个服务可能需要依赖某一个服务,比如providerService 检查级联依赖关系 默认为true 当有依赖服务的时候,需要根据需求进行设置 -->
    <dubbo:reference id="providerService " check="true"
        interface="bhz.dubbo.sample.provider.SampleService" />

四、dubbox    

dubbox管理界面配置和dubbo一样 也是要改dubbo.properties文件    dubbo 2.8.4之后的就是dubbox

1、dubbox 注解

在对外服务接口的实现类上添加 一个spring的注解 一个是alibaba的注解

@Service("simpleService")

@com.alibaba.dubbo.config.annotation.Service(interfaceClass=xiaozhou.service.SimpleService.class, protocol={"dubbo"},retries=0)

interfaceClass 要对外提供服务的接口

protocol  对外提供的协议

retries重试次数

如果采用注解的方式 要在dubbo 的xml中配置 <dubbo:annotation package="xiaozhou.service" />表示自动扫描要对外提供的接口服务

2、dubbox  restful风格

(1)、dubbo的xml中配置      如果想dubbo和rest都支持   就都要配上

<dubbo:protocol name="dubbo"/> 表示支持dubbo服务

<!-- rest 的方式要利用内置的tomcat    port 是tomcat对外提供的端口   contextpath 访问方法时的根路径     accepts  接受请求数量-->  

<dubbo:protocol name="rest" server="tomcat" port="8888" contextpath="provider" accepts="500" />   表示支持restful风格服务

可以通过dubbo或http  url的方式请求dubbo服务

(2)、在对外服务接口的实现类上添加 

//这里是spring的注解
@Service("userService")
//这个是dubbo的注解(同时提供dubbo本地,和rest方式)  如个只想支持一种服务protocol = {"rest", "dubbo"} 这个里面就写一个即可
@com.alibaba.dubbo.config.annotation.Service(interfaceClass=xiaozhou.service.UserService.class, protocol = {"rest", "dubbo"}, retries=0)

(3)、在对外服务接口或者实现类上和方法上添加 以**解  最好是在接口类和方法上添加

//rest请求的路径
@Path("/userService")
//传出数据格式表示支持xml和json(输出)
@Consumes({"application/json", "text/xml"})
//传入数据格式表示支持xml和json(输入)
@Produces({"application/json", "text/xml"})
public interface UserService{
    //rest 的GET请求        要访问这个方法的路径 是http://localhost:8888/provider/userService/testget
    @GET
    @Path("/testget")
    public void testget();

@GET
    @Path("/getUser")
    public User getUser();
    @GET
    @Path("/getUser/{id}")
    //@Path("/get/{id : \\d+}")  可以对传入的值用正则表达式进行限制    \\d+表示数字
    public User getUser(@PathParam(value = "id") Integer id);
    @GET
    @Path("/getUser/{id}/{name}")
    //@Path("/get/{id : \\d+}/{name : [a-zA-Z][0-9]}")   id只能是数字    name只能是一个字母加一个数字  如a1
    public User getUser(@PathParam(value="id") Integer id,@PathParam(value="name") String name);
    @POST   //POST请求
    public void testpost();
     @POST
     @Path("/postUser")  //POST请求  传递一个User对象     会根据@Produces这个注解自动转换成json或xml
    public User postUser(User user);
     @POST
     @Path("/postUser/{id}")  //POST请求  传递一个id字符串
    public User postUser(@PathParam(value = "id") String id);

}

在浏览器中输入http://localhost:8888/provider/userService/testget 就可以访问这个方法了

可以在实体类上加注解  改变 返回json或xml节点的名字  

 @XmlRootElement   //如果想要返回xml  格式的 必须要加  XmlRootElement和XmlAccessorType两个注解
@XmlAccessorType(XmlAccessType.FIELD)
public class User implements Serializable
{
    private static final long serialVersionUID = 1L;
    @NotNull  //字段不能是空
    private String id;
    @XmlElement(name="username")  //返回xml格式时候 节点名字是username
    @JsonProperty("name")    //{name:"张三"}  //返回json格式时候 节点名字是name
    @NotNull
    @Size(min = 6, max = 50)  //字符串长度最小6个  最大50个
    private String name;
    public User() {
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

http://localhost:8888/provider/userService/getUser.json 返回的是json格式    

http://localhost:8888/provider/userService/getUser.xml 返回的是xml格式

http://localhost:8888/provider/userService/getUser  什么都不加默认返回json格式

3、dubbo kryo 序列化

dubbo xml中配置  加入

 <!-- kryo实现序列化  -->
<dubbo:protocolname="dubbo"serialization="kryo"optimizer="xiaozhou.utils.SerializationOptimizerImpl"/>

自己实现SerializationOptimizer接口  把要序列化的类注册到kryo里面

public class SerializationOptimizerImpl implements SerializationOptimizer {

    public Collection<Class> getSerializableClasses() {
        List<Class> classes = new LinkedList<Class>();
        //这里可以把所有需要进行序列化的类进行添加
        classes.add(User.class);
        classes.add(Simple.class);
        return classes;
    }
}

User 和 Simple 实体类就不需要实现 Serializable 接口了

相关文章: