• dubbox2.8.4例子教程一


    简介

    Dubbo是一个来自阿里巴巴的开源分布式服务框架,当当根据自身的需求,为Dubbo实现了一些新的功能,包括REST风格远程调用、Kryo/FST序列化等等。并将其命名为Dubbox(即Dubbo eXtensions),教程一就写生产者,教程二就写消费者

    一、生产者工程结构

     

    二、Simple.java(测试普通dubbo功能)

    package bhz.entity;
    
    import java.io.Serializable;
    import java.util.Map;
    
    public class Simple  implements Serializable
    {  
         private static final long serialVersionUID = -4914434736682797743L;  
         private String name;  
         private int age;  
         private Map<String,Integer> map;  
         public Simple(){  
      
         }  
         public Simple(String name,int age,Map<String,Integer> map){  
             this.name = name;  
             this.age = age;  
             this.map = map;  
         }  
      
         public String getName() {  
           return name;  
         }  
      
         public void setName(String name) {  
            this.name = name;  
         }  
      
         public int getAge() {  
            return age;  
         }  
      
         public void setAge(int age) {  
            this.age = age;  
         }  
      
         public Map<String, Integer> getMap() {  
            return map;  
         }  
      
         public void setMap(Map<String, Integer> map) {  
            this.map = map;  
         }  
      
      
    }  

    2、User.java(测试dubbox特有的rest服务)

    package bhz.entity;
    
    import java.io.Serializable;
    
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import javax.xml.bind.annotation.XmlRootElement;
    
    import org.codehaus.jackson.annotate.JsonProperty;
    
    @XmlRootElement
    public class User implements Serializable
    {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        @NotNull
        private String id;
    
        @NotNull
        @Size(min = 6, max = 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;
        }
        
    }

    3、dubbo-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"
        xmlns:util="http://www.springframework.org/schema/util"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
        
        <!-- 引入properties配置文件 -->
        <util:properties id="zcparams" location="classpath:params.properties"></util:properties>
        
        <!-- 指定dubbox生产者名称 -->
        <dubbo:application name="provider" owner="programmer" organization="dubbox"/>
    
        <!-- zookeeper注册中心 -->
        <dubbo:registry address="zookeeper://192.168.0.4:2181?backup=192.168.0.5:2181,192.168.0.6:2181"/>
    
        <dubbo:annotation package="bhz.service" />
        <!-- kryo实现序列化-->
        <dubbo:protocol name="dubbo"  serialization="kryo" optimizer="bhz.utils.SerializationOptimizerImpl" /> 
    
        <!--指定 rest服务 -->
        <dubbo:protocol name="rest" server="tomcat" port="8888" contextpath="provider" accepts="500" />
    
    </beans>

    4、SimpleService.java

    package bhz.service;
    
    import bhz.entity.Simple;
    /**
     * 测试普通dubbo服务
     * @author Administrator
     *
     */
    public interface SimpleService {
        
        public String sayHello(String name);
     
        public Simple getSimple();
    }

    5、UserService.java

    package bhz.service;
    
    import javax.ws.rs.Consumes;
    import javax.ws.rs.GET;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;
    
    import bhz.entity.User;
    /**
     * 功能:本类测试dubbox的rest服务
     * @author Administrator
     *
     */
    @Path("/userService")
    @Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})    // @Consumes 注释代表的是一个资源可以接受的 MIME 类型
    @Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})    //@Produces 注释代表的是一个资源可以返回的 MIME 类型
    public interface UserService {
        @GET
        @Path("/testget")
        public void testget();
        
        @GET
        @Path("/getUser")
        public User getUser();
        
        @GET
        @Path("/get/{id : \d+}")
        public User getUser(@PathParam(value = "id") Integer id);
        
        @GET
        @Path("/get/{id : \d+}/{name : [a-zA-Z][0-9]}")
        public User getUser(@PathParam(value = "id") Integer id, @PathParam(value = "name") String name);
        
        @POST
        @Path("/testpost")
        public void testpost();
        
        @POST
        @Path("/postUser")
        public User postUser(User user);
        
        @POST
        @Path("/post/{id}")
        public User postUser(@PathParam(value = "id") String id);
    
    }

    6、SimpleServiceImpl.java

    package bhz.service.impl;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.springframework.stereotype.Service;
    
    import bhz.entity.Simple;
    import bhz.service.SimpleService;
    //spring注解
    //@Service("simpleService") 
    /*
     * dubbo注解
     * interfaceClass 指定服务接口
     * protocol 指定协议
     * retries 重试策略
     */
    @com.alibaba.dubbo.config.annotation.Service(interfaceClass=bhz.service.SimpleService.class, protocol={"dubbo"}, retries=0)
    public class SimpleServiceImpl implements SimpleService{
    
        @Override
        public String sayHello(String name) {
            return "hello" + name;
        }
    
        @Override
        public Simple getSimple() {
            Map<String,Integer> map = new HashMap<String, Integer>(2);  
            map.put("zhang0", 1);  
            map.put("zhang1", 2);  
            return new Simple("zhang3", 21, map);
        }
    
    }

    7、UserServiceImpl.java

    package bhz.service.impl;
    
    import bhz.entity.User;
    import bhz.service.UserService;
    
    
    //这个是dubbo的注解(同时提供dubbo本地,和rest方式)
    @com.alibaba.dubbo.config.annotation.Service(interfaceClass=bhz.service.UserService.class, protocol = {"rest", "dubbo"}, retries=0)
    public class UserServiceImpl implements UserService{
    
        public void testget() {
            //http://localhost:8888/provider/userService/getUser
            System.out.println("测试...get");
        }
        
    
        public User getUser() {
            System.out.println("==========");
            User user = new User();
            user.setId("1001");
            user.setName("张三");
            return user;
        }
    
    
        public User getUser(Integer id) {
            System.out.println("测试传入int类型的id: " + id);
            User user = new User();
            user.setId("1001");
            user.setName("张三");
            return user;
        }
        
        
    
        public User getUser(Integer id, String name) {
    
            System.out.println("测试俩个参数:");
            System.out.println("id: " + id);
            System.out.println("name: " + name);
            User user = new User();
            user.setId("1001");
            user.setName("张三");
            return user;
        }
        
    
        public void testpost() {
            System.out.println("测试...post");
        }
        
    
        public User postUser(User user) {
            System.out.println(user.getName());
            System.out.println("测试...postUser");
            User user1 = new User();
            user1.setId("1001");
            user1.setName("张三");
            return user1;
        }
    
    
        public User postUser(String id) {
            System.out.println(id);
            System.out.println("测试...post");
            User user = new User();
            user.setId("1001");
            user.setName("张三");
            return user;
        }
        
        
    
    }

    8、FastJsonConvert.java(fastJson转换工具类)

    package bhz.utils;
    
    import java.util.List;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    
    /**
     * 功能:fastJson转换工具类
     * @author jacky
     *
     */
    public class FastJsonConvert {
    
    
        private static final SerializerFeature[] featuresWithNullValue = { SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullBooleanAsFalse,
                SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullStringAsEmpty };
    
        /**
         * JsonString 转换 Object
         * 
         * @param <T>
         * @param data
         * @param clzss
         * @return
         */
        public static <T> T convertJSONToObject(String data, Class<T> clzss) {
            try {
                T t = JSON.parseObject(data, clzss);
                return t;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
    
            }
        }
        /**
         * JsonString 转换 List<Object>
         * 
         * @param <T>
         * @param data
         * @param clzss
         * @return
         */
        public static <T> List<T> convertJSONToArray(String data, Class<T> clzss) {
            try {
                List<T> t = JSON.parseArray(data, clzss);
                return t;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
                
            }
        }
    
        /**
         * 功能:把java对象序列化成json字符串
         * @param obj  java实体
         * @return   json字符串
         */
        public static String convertObjectToJSON(Object obj) {
            try {
                String text = JSON.toJSONString(obj);
                System.out.println(text);
                return text;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    
        /**
         * Object to JsonString
         *
         * @param <T>
         * @param data
         * @param valueType
         * @return
         */
        public static String convertObjectToJSONWithNullValue(Object obj) {
            try {
                String text = JSON.toJSONString(obj, featuresWithNullValue);
                return text;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    
        public static void main(String[] args) {
            System.err.println(System.getProperties());
        }
    }

    9、HttpProxy.java(发送http请求,测试rest服务的工具类)

    package bhz.utils;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.http.Consts;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpStatus;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.EntityBuilder;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.ContentType;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.entity.mime.MultipartEntityBuilder;
    import org.apache.http.entity.mime.content.FileBody;
    import org.apache.http.entity.mime.content.StringBody;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    
    public class HttpProxy {
        private static class SingletonHolder {
            static final HttpProxy instance = new HttpProxy();
        }
    
        public static HttpProxy getInstance() {
            return SingletonHolder.instance;
        }
    
        private static CloseableHttpClient httpClient;
        
        private static final String CONTENT_TYPE_JSON = "application/json";
    
        static {
            PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
            cm.setMaxTotal(HttpProxyConfig.MAX_TOTAL_CONNECTIONS);
            cm.setDefaultMaxPerRoute(HttpProxyConfig.MAX_ROUTE_CONNECTIONS);
            
            
            RequestConfig requestConfig = RequestConfig.custom()
                    .setSocketTimeout(HttpProxyConfig.CONNECT_TIMEOUT)
                    .setConnectTimeout(HttpProxyConfig.CONNECT_TIMEOUT)
                    .build();
            //缓存
            /*        
             CacheConfig cacheConfig = CacheConfig.custom()
                    .setMaxCacheEntries(1000)
                    .setMaxObjectSize(8192)
                    .build();
            */
            httpClient = HttpClients.custom()
                    .setDefaultRequestConfig(requestConfig)
                    .setConnectionManager(cm)
                    .build();
        }
    
        public static HttpClient getHttpClient() {
            return httpClient;
        }
        
        /**
         * <B>方法名称:</B>普通请求<BR>
         * <B>概要说明:</B>普通请求<BR>
         * @param requestUrl 请求路径
         * @param requestContent 请求内容
         * @return 返回响应结果
         * @throws IOException
         */
        public static String post(String requestUrl, String requestContent) throws IOException {
            StringEntity requestEntity = new StringEntity(requestContent, Consts.UTF_8);
            return execute(requestUrl,requestEntity);
        }
        
        /**
         * 功能:发送json请求
         * @param requestUrl   请求路径url
         * @param jsonContent  json字符串
         * @return 返回json字符串
         * @throws IOException
         */
        public static String postJson(String requestUrl, String jsonContent) throws IOException {
            StringEntity requestEntity = new StringEntity(jsonContent, Consts.UTF_8);
            requestEntity.setContentEncoding("UTF-8");    
            requestEntity.setContentType(CONTENT_TYPE_JSON);  
            return execute(requestUrl,requestEntity);
        }
    
        /**
         * <B>方法名称:</B>模拟表单上传<BR>
         * <B>概要说明:</B>模拟表单上传<BR>
         * @param requestUrl 请求路径
         * @param params 属性参数
         * @return 返回响应结果
         * @throws IOException
         */
        public static String post(String requestUrl, Map<String, String> params) throws IOException {
            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
            if (params != null) {
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
                }
            }
            EntityBuilder builder = EntityBuilder.create();
            builder.setParameters(nvps);
            HttpEntity httpEntity = builder.build();
            return execute(requestUrl,httpEntity);
        }
        
        /**
         * <B>方法名称:</B>上传文件<BR>
         * <B>概要说明:</B>上传文件<BR>
         * @param requestUrl 请求路径
         * @param localFile  文件位置
         * @param username       用户名
         * @param password       密码
         * @return 响应信息
         * @throws IOException
         */
        public static String upload(String requestUrl, String localFile, String username, String password) throws IOException {
            HttpPost httpPost = new HttpPost(requestUrl);
            // 把文件转换成流对象FileBody
            FileBody fileBody = new FileBody(new File(localFile));
            StringBody usernameInp = new StringBody(username, ContentType.create("text/plain", Consts.UTF_8));
            StringBody passwordInp = new StringBody(password, ContentType.create("text/plain", Consts.UTF_8));
            HttpEntity httpEntity = MultipartEntityBuilder.create()
                    // 相当于<input type="file" name="file"/>
                    .addPart("file", fileBody)
                    // 相当于<input type="text" name="userName" value=userName>
                    .addPart("username", usernameInp)
                    .addPart("password", passwordInp)
                    .build();
            return execute(requestUrl,httpEntity);
        }
        
        /**
         * 功能:执行请求方法
         * @param requestUrl 请求路径Url
         * @param httpEntity  封装好的http实体
         * @return json字符串
         * @throws IOException
         */
        private static String execute(String requestUrl, HttpEntity httpEntity) throws IOException {
            String result = null;
            HttpPost httpPost = new HttpPost(requestUrl);
            httpPost.setEntity(httpEntity);    
            try {
                CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
                try {
                    HttpEntity entity = httpResponse.getEntity();
                    if (httpResponse.getStatusLine().getReasonPhrase().equals("OK") && httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                        result = EntityUtils.toString(entity, "UTF-8");
                    }
                    //进行销毁
                    EntityUtils.consume(entity);
                } finally {
                    if (null != httpResponse) {
                        httpResponse.close();
                    }
                }
            } finally {
                if (null != httpPost) {
                    httpPost.releaseConnection();
                }
            }
            return result;
        }
        /**
         * 功能:发送http的get请求
         * @param requestUrl   请求url
         * @return 字符串
         */
        public static String get(String requestUrl){
            HttpGet httpGet = new HttpGet(requestUrl);
            // 执行get请求.  
            CloseableHttpResponse response =null;
            HttpEntity entity =null;
            String result =null;
            try {
                response = httpClient.execute(httpGet);
                entity = response.getEntity();
                 // 打印响应状态    
                System.out.println(response.getStatusLine());  
                if (entity != null) {  
                    // 打印响应内容长度    
                    System.out.println("Response content length: " + entity.getContentLength());  
                    // 打印响应内容    
                    result = EntityUtils.toString(entity);
                    System.out.println("Response content: " + result);  
                }  
                System.out.println("------------------------------------");   
            } catch (Exception e) {
                e.printStackTrace();
            }finally {  
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }  
            }  
            return result;    
        }
        
    
        
    }

    10、HttpProxyConfig.java

    package bhz.utils;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    /**
     * <br>
     * 类 名: HttpCallerConfig <br>
     * 描 述: http属性配置参数 <br>
     */
    @Component
    public class HttpProxyConfig {
        /**
         * 最大连接数
         */
        public static int MAX_TOTAL_CONNECTIONS = 800;
        /**
         * 每个路由最大连接数
         */
        public static int MAX_ROUTE_CONNECTIONS = 400;
        /**
         * 连接超时时间
         */
        public static int CONNECT_TIMEOUT = 10000;
        /**
         * 读取超时时间
         */
        public static int READ_TIMEOUT = 10000;
    
        /**
         * 设置 mAX_TOTAL_CONNECTIONS
         * 
         * @param mAX_TOTAL_CONNECTIONS
         */
        @Value("#{zcparams[max_total_connections]}")
        private void setMAX_TOTAL_CONNECTIONS(int mAX_TOTAL_CONNECTIONS) {
            MAX_TOTAL_CONNECTIONS = mAX_TOTAL_CONNECTIONS;
        }
    
        /**
         * 设置 mAX_ROUTE_CONNECTIONS
         * 
         * @param mAX_ROUTE_CONNECTIONS
         */
        @Value("#{zcparams[max_total_connections]}")
        private void setMAX_ROUTE_CONNECTIONS(int mAX_ROUTE_CONNECTIONS) {
            MAX_ROUTE_CONNECTIONS = mAX_ROUTE_CONNECTIONS;
        }
    
        /**
         * 设置 cONNECT_TIMEOUT
         * 
         * @param cONNECT_TIMEOUT
         */
        @Value("#{zcparams[connect_timeout]}")
        private void setCONNECT_TIMEOUT(int cONNECT_TIMEOUT) {
            CONNECT_TIMEOUT = cONNECT_TIMEOUT;
        }
    
        /**
         * 设置 rEAD_TIMEOUT
         * 
         * @param rEAD_TIMEOUT
         */
        @Value("#{zcparams[read_timeout]}")
        private void setREAD_TIMEOUT(int rEAD_TIMEOUT) {
            READ_TIMEOUT = rEAD_TIMEOUT;
        }
    
    }

    11、SerializationOptimizerImpl.java(自定义序列化实现类)

    package bhz.utils;
    
    import java.util.Collection;
    import java.util.LinkedList;
    import java.util.List;
    
    import bhz.entity.Simple;
    import bhz.entity.User;
    
    import com.alibaba.dubbo.common.serialize.support.SerializationOptimizer;
    
    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;
        }
    }

    12、log4j.properties

    log4j.rootLogger=INFO, console, file
    
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n
    
    log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
    #log4j.appender.file.File=D:/002_developer/workspace_001/zcmoni.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n
    
    log4j.logger.org.springframework=WARN

    13、params.properties

    #HttpCaller
    max_total_connections = 1600
    max_route_connections = 1200
    connect_timeout = 30000
    read_timeout = 30000

    14、Provider.java(启动dubbo服务类)

    package bhz.test;
    
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Provider {
    
        public static void main(String[] args) throws Exception {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                    new String[] { "dubbo-provider.xml" });
            context.start();
            System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟
        }
    }

    15、HttpTest1.java(测试dubbox的rest服务类)

    package bhz.test;
    
    import bhz.entity.User;
    import bhz.utils.FastJsonConvert;
    import bhz.utils.HttpProxy;
    
    public class HttpTest1 {
    
        public static void main(String[] args) throws Exception{
            User user = new User();
            user.setId("1001");
            user.setName("李四");
            String responseStr1 = HttpProxy.postJson("http://localhost:8888/provider/userService/postUser",
                    FastJsonConvert.convertObjectToJSON(user));
            System.out.println("post请求返回的结果"+responseStr1);
            System.out.println("========================");
            String string = HttpProxy.get("http://localhost:8888/provider/userService/getUser");
            System.out.println("get请求返回的结果"+string);
            
        }
    }

    16、测试结果

    ========================
    HTTP/1.1 200 OK
    Response content length: -1
    Response content: {"id":"1001","name":"张三"}
    ------------------------------------
    get请求返回的结果{"id":"1001","name":"张三"}

    参考资料地址

    http://dangdangdotcom.github.io/dubbox/

    http://www.open-open.com/lib/view/open1417426480618.html

  • 相关阅读:
    第59节:Java中的html和css语言
    第59节:Java中的html和css语言
    小程序版本再次发布升级
    Java中的图形界面编程-GUI
    第58节:Java中的图形界面编程-GUI
    第58节:Java中的图形界面编程-GUI
    解决微信小程序登录与发布的一些问题
    解决微信小程序登录与发布的一些问题
    第57节:Java中流的操作以及编码解码
    第57节:Java中流的操作以及编码解码
  • 原文地址:https://www.cnblogs.com/520playboy/p/6344994.html
Copyright © 2020-2023  润新知