异构(兼容dubbo)SOA系统架构(.net)优化升级
前面一片文章已经提到我司的异构(兼容dubbo)SOA系统架构,解决了不少技术痛点,也还算比较完善,也顺利推广开来。
但作为项目的开发者,自己产品的问题心里是清楚的,离自己满意还是有不小的距离。
在推广的同时,我紧张的进入了下一个版本的开发,让它更加完善。
原来的版本号是1.0,现在版本升级为1.1且已经开发完成并发布(内部),本次升级主要内容如下:
class Program { static IContainer _container; static void Main(string[] args) { IContainer container = _container = new SimpleContainer() .SOALoadSettings();//加载appSettings配置 CreateHelloWorld(container);//HelloWorld服务 container.SOAStart();//启动所有服务 Console.ReadLine(); } /// <summary> /// HelloWorld服务 /// </summary> /// <param name="container"></param> private static void CreateHelloWorld(IContainer container) { string serviceName = "com.fang.HelloWorld$Iface";//服务名 var service = new HelloWorldImp();//服务实现逻辑 container.SOAProvider<HelloWorldService.Iface>(serviceName, service);//注册服务 } }
哈哈,简单吧。
除了简单还有什么?是不是也非常的流畅啊
你没看错,以上区区几个行代码就完成了SOA服务的发布工作
注:如果要在同一个应用程序中注册(发布)多个服务依次注册即可
5、对比1.0版本少的东西
5.1 ZKInit方法没有了
这是一个重大变化,原来是要先把zooKeeper连接上才可以"发布"服务的
现在没有这个必须前提了,zooKeeper连接异步化了,需要zooKeeper的时候从IOC容器中获取,如果容器没有,再异步连接zooKeeper并保存到IOC容器中,以后需要的时候随时取。
5.2 增加了container(IOC容器)
这也是一个重大变化,现在SOA配置是依赖容器的,实际所有的参数都是从容器获取,程序初始化的时候给需要的每个参数在容器里面注入了默认值,如果需要配置覆盖默认值即可
上面的SOALoadSettings就是容器扩展方法,用于把appSettings中SOA相关节点的数据加载容器中
其实几乎SOA各大组件、运行需要对象、对象缓存服用很多都是用该容器实现的
5.3 1.0版本中ZKConsumer一哥的位置被无情的抛弃了
1.0版本中ZKConsumer几乎是.net SOA直接交互的唯一一个类
后来随着SOA系统完善,我发现ZKConsumer担不起一哥这个角色就抛弃了它,启用与SOA"毫无关系"的IContainer(容器接口)
这会是以后的趋势,我们"不再需要牢记"每个系统个性化的业务名词(类),我们使用IContainer通用对象的扩展方法来定义简单Api
我们使用一个系统的方法就变成了引用该系统的Nuget包(dll),引用该系统的命名空间,然后在IContainer下找该系统的Api(扩展方法)来用即可
启动一个系统就变成了给该系统配置容器,可以通过文件配置也可以通过代码配置
private static void CreateHelloWorld(IContainer container) { string serviceName = "com.fang.HelloWorld$Iface";//服务名 var service = new HelloWorldImp();//服务实现逻辑 string serviceIp = "192.168.109.166";//发布服务使用ip int servicePort = 5000;//发布服务使用端口 string group = "kg";//应用程序分组 string serviceVersion = "1.0.0";//服务版本 int serviceTimeOut = 5000; //服务超时阈值(单位Millisecond) int alertElapsed = 3000; //服务执行耗时监控报警阈值(单位Millisecond) int alertFailure = 10; //服务每分钟出错次数监控报警阈值 container.SOAServiceHost(serviceIp, servicePort, serviceName) .SOAServiceGroup(group, serviceName) .SOAServiceVersion(serviceVersion, serviceName) .SOAServiceTimeout(serviceTimeOut, serviceName) .SOAAlertelapsed(alertElapsed, serviceName) .SOAAlertfailure(alertFailure, serviceName); container.SOAProvider<HelloWorldService.Iface>(serviceName, service);//注册服务 }
有人说,你这代码更多了,是对1.0版的退化吗?
其一、并不是每个服务都有那么多个性化的配置,提供必须参数的简单api提高使用体验
其二、配置多元化了,代码配置不再是不二选择,必须写的代码更少了
static void Main(string[] args) { IContainer container = _container = new SimpleContainer() .SOALoadSettings()//加载appSettings配置 .SOALog();//开启所有日志 CreateHelloWorld(container);//HelloWorld服务 container.SOAStart();//启动所有服务 Console.ReadLine(); }
2、开启日志默认效果如下:
public class HelloWorldTest { static IContainer _container; public static void Test() { IContainer container = _container = new SimpleContainer() .SOALoadSettings()//加载appSettings配置 .SOALog(); Subcribe(container);//订阅com.fang.HelloWorld string str = null; do { str = Console.ReadLine(); if (string.Equals(str, "Exit", StringComparison.CurrentCultureIgnoreCase)) return; Console.WriteLine("callService"); CallService();//调用服务 } while (true); } private static void Subcribe(IContainer container) { string serviceName = "com.fang.HelloWorld$Iface";//服务名 string serviceGroup = "kg";//服务分组 container.SOAConsumer<HelloWorldService.Iface>(serviceName, serviceGroup, zooKeeper); } private static void CallService() { if (_container == null) return; string results = null; using (var resource = _container.SOAService<HelloWorldService.Iface>()) { if (resource == null) return results; HelloWorldService.Iface service = resource.Service; if (service == null) { Console.WriteLine("service is null"); return results; } else { var socket = resource.Socket; Console.WriteLine(string.Concat(socket.Host, ":", socket.Port.ToString(), "为您服务")); } try { results = service.sayHello("Word"); } catch (Exception ex) { var socket = resource.Socket; if (socket != null) Console.WriteLine(string.Concat(socket.Host, ":", socket.Port.ToString(), "出错")); Console.WriteLine(ex.Message); } } } }
注:1.1客户端还是满满的容器扩展方法,简洁的Api,和服务端一样可以使用容器配置服务的个性化的参数(这里就不展开了)
2、执行效果如下:
CallService 192.168.109.166:3459为您服务 Hello word CallService 192.168.109.166:3458为您服务 Hello word CallService 192.168.109.166:3457为您服务 Hello word CallService 192.168.109.166:3456为您服务 Hello word CallService 192.168.109.166:3459为您服务 Hello word CallService 192.168.109.166:3458为您服务 Hello word CallService 192.168.109.166:3457为您服务 Hello word
我本地跑着4个服务,按轮询提供服务
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
异构SOA系统架构之Asp.net实现(兼容dubbo)
原文: 异构SOA系统架构之Asp.net实现(兼容dubbo) 我们公司技术部门情况比较复杂,分到多个集团,每个集团又可能分为几个部门,每个部门又可能分为多个小组,组织架构比较复杂,开发人员比较多。 使用的编程语言也有点复杂,主流语言有.net(C#)、Java、PHP等。 所以SOA架构需要的是异构SOA。 有的同学可能说这个简单吗?“把部门合并扁平化合并为一个团队,把语言统一一种,要么.net要么Java。” 其实这样的简单粗暴并不能很好的解决问题的 首先公司组织架构就是不能随便修改的,一个公司的组织架构就是服务于这个公司的经营理念和营销模式,技术部门是服务机构并不直接产生价值,技术部门架构和公司组织架构高度一致能带来业务的高效性。 其次多语言技术体系也有其可取性 某个项目哪种语言能做的更快更好就用哪种语言 哪种语言的程序员好招,就多招一些,能在各种技术方向的变化中立于不败之地 现在继续说SOA,说起公司对SOA选型对于.net程序员开始还是一件挺悲催的事情,因为公司选的是dubbo dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,说它是个伟大的开源项目并不为...
- 下一篇
HybridDB for MySQL计算规格全面加速OLAP场景
前言 在2018年双十一中,阿里云数据库HybridDB为几十万商家提供数据驱动的店铺智能服务,也为几千小二提供了高效的数据化服务产品,大大提高生产效率。 盒马实时交易大盘使用HybridDB实现盒马全链路的数据实时闭环,支撑1000多张表的复杂查询,平均查询延迟1秒以内,大大提高了新零售的数据化能力。菜鸟仓储实时在线数仓,基于HybridDB for MySQL构建了容纳核心的订单、包裹、库存及时效等全链路数据,目前已经成长为菜鸟仓储业务的数据化产品基石。 HybridDB 承接ECS、RDS、CDN、SLB等阿里云核心业务提供实时监控数据的存储、计算服务,以及支撑了四大件产品双十一实时监控大屏。为阿里云双十一保驾护航。 经过双十一的洗礼后,HybridDB for MySQL最新推出OLAP增强的高性能计算规格,通过自研的列式存储引擎CStore全面加速分析场景。主打毫秒级实时数据更新+百亿大表任意维度毫秒级分析,在完备的SQL能力上,同时支持在SQL中的多值子列查询、全文检索、空间检索等功能特性。既支持通过数据同步工具实时写入数据也支持直接和离线数仓ODPS的快速数据TB每小时的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Red5直播服务器,属于Java语言的直播服务器