您的位置:首页 > 运维架构 > 网站架构

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

2017-12-25 10:56 615 查看
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)){ //取消关注事件

     
c861
     //用户取消时修改用户数据库

           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。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐