dubbo+zookeeper实现soa架构的微服务应用

来源:互联网 发布:淘宝代销1688发货流程 编辑:程序博客网 时间:2024/05/22 06:50

Dubbo也是一套微服务框架,他与SpringCloud的区别就是,他支持多种协议,而SpringCloud只支持Http协议。如果没有分布式,那么他是不存在的。

dubbo是阿里巴巴旗下的一款分布式软件,它的新能非常优越。学习前引入三个概念:1消费者 2 提供者 3 注册中心。这三个概念我们必须了解清楚。

提供者:通俗的讲就是远程服务的提供者(一到多个)。

消费者:就是调用远程服务的(一到多个)。

注册中心:充当两者的中间角色 将远程服务注册到注册中心上,然后随机分配给消费者调用。

Dubbo有服务治理的能力:透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单 配置,没有任何API侵入。 ②:集群容错:软负载均衡及容错机制,可在内网替代F5等硬件负鞭均衡器,降低成本,减少单点。 ③:自动发现:服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。 另外:Dubbo采用全Spring 配置方式,功明化接入应用,对应用没有任何API侵只需用Spring加载Dubbo的配置即可,Dubbo基FSpring的Schema扩入,展进行加载

现在我是基于http协议实现一个小小的实例:

以微信开发为例。

我们的程序需要和微信信息交互。就需要对接到微信的服务接口。


这里需要将自己本地ip进行一个域名映射。这样微信才能访问到我们的程序。

我将项目结构贴出来 基于springboot+mybatis+mysql 


和以前的单一应用不同的点是,我们将单一应用分成了垂直应用架构。这样便于分模块开发。可以完全分。你需要掌握maven下如何构建多个子模块程序。好了,我们今天重点介绍的还是分布式,我的程序提供了remoteserver 和remoteserverimpl 两个模块,一个是远程提供服务的接口。一个远程服务的实现类。我们把写好的cardsystem-remoteserver打包发送给不同的消费者。然后将我们的应用多个不同的机器上工消费者调用这就是我们今天需要做的事。

先看remoteserver 定义了一个处理及响应微信消息的核心接口类。 


具体实现了代码:

@Override
public String processRequest(StringBuffer xml) {
    String respMessage = "";
    BaseMessage baseMessage = MessageUtil.xmlToObj(BaseMessage.class, xml);
    // 发送方帐号(open_id)
        String fromUserName = baseMessage.getFromUserName();
        // 公众帐号
        String toUserName = baseMessage.getToUserName();
        // 消息类型
        String  msgType = baseMessage.getMsgType().toString();
        
    //自动回复消息
        if(msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)){  //收到事件
           EventMessage eventMessage =  MessageUtil.xmlToObj(EventMessage.class, xml);
       
       MenuEvent menuEvent = MessageUtil.xmlToObj(MenuEvent.class, xml);
       System.out.println("微信传来====="+JSON.toJSONString(menuEvent));
           if(eventMessage.getEvent().toString().equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){ //关注事件
            //用户关注微信号时获取用户信息并存取到数据库
           //添加之前查询数据库避免插入重复数据
           Map<String,String> map = new HashMap<String, String>();
           map.put("openid", fromUserName);
           List<Wxuserinfo> list = wxuserinfoMapper.searchWxuserinfoByParams(map);
           
           if(list.size()==0){ //添加新用户
            Wxuserinfo userinfo = getUserinfoByOpenid(fromUserName);  
            userinfo.setRole("0");
            wxuserinfoMapper.insertWxuserinfo(userinfo);
           }else{ //老客户
          Wxuserinfo wxuserinfo = list.get(0);
          wxuserinfo.setSubscribe("1");
          wxuserinfoMapper.updateWxuserinfo(wxuserinfo);
           }
           ReplyText replyText = new ReplyText();
           replyText.setFromUserName(toUserName);
           replyText.setToUserName(fromUserName);
           replyText.setContent("这里是酱菜荣耀卡券服务平台");
           replyText.setCreateTime(System.currentTimeMillis());
               respMessage = MessageUtil.objToXml(ReplyText.class, replyText);
           }else if(eventMessage.getEvent().toString().equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){ //取消关注事件
           //用户取消时修改用户数据库
           Map<String, String> map = new HashMap<String, String>();
           map.put("openid", fromUserName);
           List<Wxuserinfo> list = wxuserinfoMapper.searchWxuserinfoByParams(map);
           Wxuserinfo wxuserinfo = list.get(0);
           wxuserinfo.setRole("0");
           wxuserinfo.setSubscribe("0");
           wxuserinfoMapper.updateWxuserinfo(wxuserinfo);
           System.out.println("收到取消关注事件");
           System.out.println(xml.toString());
      
           }else if(eventMessage.getEvent().toString().equals(MessageUtil.EVENT_TYPE_SCAN)){  //已关注
           
            System.out.println("收到扫描事件");
            System.out.println(xml.toString());
           }else if(menuEvent.getEventKey().equals("getcard")){ //领取卡券
           //回复卡券图文信息
           ReplyImgAndText replyImgAndText = new ReplyImgAndText();
           replyImgAndText.setToUserName(fromUserName);
           replyImgAndText.setFromUserName(toUserName);
           replyImgAndText.setCreateTime(System.currentTimeMillis());
           List<_Item> articles = new ArrayList<_Item>();
           //查询卡券信息
           _Item item = new _Item();
           item.setUrl("www.baidu.com");
           item.setTitle("领券啦");
           item.setPicurl("http://g.hiphotos.baidu.com/image/pic/item/b3119313b07eca800b6ae3f49b2397dda14483b2.jpg");
           item.setDescription("双十二代金券100元");
           item.setDescription("数量有限,先到先得");
           
           _Item item2 = new _Item();
           item2.setUrl("www.soso.com");
           item2.setTitle("领券啦");
           item2.setPicurl("http://g.hiphotos.baidu.com/image/pic/item/b3119313b07eca800b6ae3f49b2397dda14483b2.jpg");
           item2.setDescription("双十二代金券100元");
           item2.setDescription("数量有限,先到先得");
           articles.add(item);
           articles.add(item2);
           replyImgAndText.setArticleCount(articles.size());
           replyImgAndText.setArticles(articles);
           respMessage = MessageUtil.objToXml(ReplyImgAndText.class, replyImgAndText);
           System.out.println("领取卡券");
           }else if(menuEvent.getEventKey().equals("usercardlist")){ //获取卡包
           System.out.println("获取卡包");
           }else if(menuEvent.getEventKey().equals("checkcard")){ //核销卡券
           System.out.println("核销卡券");
           }else{
           System.out.println("位置事件");
           }
           
  
        }
return respMessage;
}

然后将我们的服务通过dubbo注册到注册中心zookeeper上

<?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="cardsystem-remoteserverimpl"
owner="**" />


<dubbo:registry protocol="zookeeper" address="192.168.1.123:2181"
file="~/.dubbo/dubbo-demo-provider.cache" />


<!-- 指定调用时候端口号随机分配 -->
<dubbo:protocol name="dubbo" port="-1" />
<!-- 指定发布的服务接口类型 和服务实现类的对象名 -->
<dubbo:service interface="com.*.card.remote.service.WxCoreService"
ref="wxCoreServiceImpl" />
</beans>

基本这样我们提供者算是齐全了。

接下来看消费者代码:

在新建一个项目 

在controller中调用我们刚才配置的接口。只需要通过自动注入接口类,直接调用。


配置文件如下:

<?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="dubbo-demo-test" owner="rocky"/>


    <dubbo:registry protocol="zookeeper" address="192.168.1.123:2181" 
    file="~/.dubbo/dubbo-demo-test.cache"/>
    
    <dubbo:protocol name="dubbo" port="-1"/>


    <dubbo:reference id="wxCoreService" interface="com.*.card.remote.service.WxCoreService" check="false"/>
</beans>

启动dubbo和zookeeper。。。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 凯美瑞手动挡 凯美瑞座椅套 汽车凯美瑞 凯美瑞前保险杠 凯美瑞经典款 混合动力凯美瑞 凯美瑞车标 凯美瑞缺点 凯美瑞轿车 雅阁对比凯美瑞 凯美瑞倒车影像 凯美瑞和帕萨特 凯美瑞 迈腾 2009款凯美瑞 凯美瑞空调滤芯 凯美瑞日行灯 凯美瑞脚垫 06款凯美瑞 凯美瑞行车记录仪 凯美瑞价格 凯美瑞降价 广汽凯美瑞报价 凯美瑞混合 06年凯美瑞 第六代凯美瑞 凯美瑞保养周期 凯美瑞换代 09年凯美瑞 二手凯美瑞报价 15款凯美瑞 凯美瑞英文 雅阁 凯美瑞 08凯美瑞 2010款凯美瑞 6代凯美瑞 12款凯美瑞 凯美瑞保养费用 凯美瑞2.0油耗 凯美瑞仪表盘图解 凯美瑞试驾 09款凯美瑞