微服务架构及 Dubbo 微服务调用的时序图

用户头像
garlic
关注
发布于: 2020 年 11 月 29 日
微服务架构及Dubbo 微服务调用的时序图

微服务架构





Microservices architecture style (microsoft)



微服务的一些特点:



  • 微服务是小型,独立且松散耦合的。

  • 每个服务都是一个单独的代码库。

  • 服务可以独立部署。

  • 数据去中心化,服务保存其自己的数据。

  • 轻量级通讯, 服务通过使用API相互通信。

  • 产品化,按照产品实施是,持续改进提升。

  • 微服务推行一般也伴随着组织结构的调整。 



经常与微服务提到的一些概念:



  • 中台架构

与微服务没有直接关系, 中台是企业级别功能复用,针对企业级别的架构设计一般分为: 业务中台,数据中台, 技术中台

  • 领域驱动设计

是对具体业务领域的建模抽象

  • 组件设计原则

具体技术实现的一些指导原则。



我们团队中没有使用微服务,但这种精细化应该是趋势。

以我所在团队组织架构为例, 开始我们是一个大的项目组, 负责一个产品, 需求不断增加, 项目负责人根本无法应付, 后来根据不同的业务渠道, 将原有产品分为多个子产品, 项目组也对应的分为多个小组,有专有 的开发,测试人员。 每个小组专注自己负责渠道产品。

这种拆分,子产品职责边界更加清晰, 代码也变少了, 单独的部署,单独发布, 互相影响也变少了, 项目也更加便于维护了。

各个组之间一些交互,开始的时候我们使用的数据库(dblink)这种方式, 后来发现一旦提供服务方的数据库变动, 可能导致服务使用方也要跟着变更,有时候评估不到,会导致一些生产问题, 后来我们通过提供联机服务方式屏蔽一些内部调整。

Dubbo 微服务调用的时序图





服务注册

服务调用





示例:

根据dubbo官网的demo修改了一个简单版本, 通过Payment描述接口, Provider 实现服务提供, consumer调用服务, 使用zookeeper做为注册中心。



Payment.java 支付功能定义


public interface Payment {
String pay(String message);
}




PaymentImpl.java 支付功能实现

public class PaymentImpl implements Payment{
public String pay(String message) {
return "pay " + message;
}
}



Provider.java 通过 provider.xml 完成服务注册

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Provider {
public static void main(String[] args) throws Exception{
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://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">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="payment-app" />

<!-- 使用multicast广播注册中心暴露服务地址
<dubbo:registry address="multicast://224.5.6.7:1234"/>-->
<dubbo:registry address = "zookeeper://127.0.0.1:2181" timeout="60000"/>
<!--<dubbo:registry address = "N/A" />-->

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

<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="Payment" ref="payment"/>

<!-- 和本地bean一样实现服务 -->
<bean id="payment" class="PaymentImpl"/>
</beans>



Consumer.java 实现服务的调用

import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"consumer.xml"});
context.start();
Payment payment = (Payment)context.getBean("payment");
String result = payment.pay("success");
System.out.println(result);
System.in.read();
}
}




comsumer.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://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">

<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="consumer-of-payment-app" />

<!-- 使用multicast广播注册中心暴露发现服务地址
<dubbo:registry address="multicast://224.5.6.7:1234" />
<dubbo:registry address = "zookeeper://localhost:2181" check="false"/>
<dubbo:registry address = "N/A"/>-->
<dubbo:registry address = "zookeeper://127.0.0.1:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="payment" interface="Payment" />
</beans>



下载zookeeper, 启动服务 zkServer.cmd

我这里是windows环境

运行 provider , 通过zookeeper客户端可以看到 dubbo相关注册信息

[zk: localhost:2181(CONNECTED) 0] ls /
[dubbo, zookeeper]



运行Consumer可以看到服务调用结果

。。。
[29/11/20 17:19:24:314 CST] DubboSaveMetadataReport-thread-1 INFO support.ConfigCenterBasedMetadataReport: [DUBBO] store consumer metadata. Identifier : org.apache.dubbo.metadata.report.identifier.MetadataIdentifier@6e7dd4e0; definition: {init=false, side=consumer, metadata-type=remote, application=consumer-of-payment-app, release=2.7.8, methods=pay, sticky=false, dubbo=2.0.2, interface=Payment}, dubbo version: 2.7.8, current host: 192.168.37.100
pay success




另外dubbo 还提供了页面管理端, dubbo-admin可以进行服务路由、监控、配置等功能, 可以通过过zipkin进行路由的分析。



参考及引用



架构师训练营作业-李智慧老师相关讲义

Photo by Valeria Vinnik from Pexels

https://docs.microsoft.com/en-us/azure/architecture/guide/architecture-styles/microservices



用户头像

garlic

关注

还未添加个人签名 2017.11.15 加入

还未添加个人简介

评论

发布
暂无评论
微服务架构及Dubbo 微服务调用的时序图