异构(兼容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 = ;//发布服务使用端口
string group = "kg";//应用程序分组
string serviceVersion = "1.0.0";//服务版本
int serviceTimeOut = ; //服务超时阈值(单位Millisecond)
int alertElapsed = ; //服务执行耗时监控报警阈值(单位Millisecond)
int alertFailure = ; //服务每分钟出错次数监控报警阈值
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个服务,按轮询提供服务
异构(兼容dubbo)SOA系统架构(.net)优化升级的更多相关文章
- 异构SOA系统架构之Asp.net实现(兼容dubbo)
我们公司技术部门情况比较复杂,分到多个集团,每个集团又可能分为几个部门,每个部门又可能分为多个小组,组织架构比较复杂,开发人员比较多. 使用的编程语言也有点复杂,主流语言有.net(C#).Java. ...
- dubbo框架----探索-大型系统架构设计(图解)
对于高并发系统的架构要求: 1. 负载均衡 2.高并发 3.高可用 4.面向服务架构 (Dubbo框架使用) 5.分布式缓存 (redis分布式缓存) 6.分布式全文检索 (solr分分布式全文检索) ...
- [转]系统架构演变--集中式架构-垂直拆分-分布式服务-SOA(服务治理)-微服务
一.系统架构演变 1.1. 集中式架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键. 存在的 ...
- SOA的企业系统架构
基于SOA的企业系统架构设计及IT治理日记 (引) TOGAF是一个架构框架,指导做企业架构的标准和方法,简而言之,是一种协助开发.验收.运行.使用和维护架构的工具,核心是架构开发方法(ADM)指导了 ...
- 基于Flume的美团日志收集系统 架构和设计 改进和优化
3种解决办法 https://tech.meituan.com/mt-log-system-arch.html 基于Flume的美团日志收集系统(一)架构和设计 - https://tech.meit ...
- 高性能网站性能优化与系统架构(ZT)
转载请保留出处:俊麟 Michael’s blog (http://space.itpub.net/7311285/viewspace-97) 我在CERNET做过拨号接入平台的搭建,而后在Yahoo ...
- SOA 新业务语言 新系统架构——什么是SOA
原文地址:http://blog.csdn.net/ichaos/archive/2008/01/20/2054377.aspx SOA的概念是Gartner在1996年提出来的,并于2002年12月 ...
- 学习笔记TF048:TensorFlow 系统架构、设计理念、编程模型、API、作用域、批标准化、神经元函数优化
系统架构.自底向上,设备层.网络层.数据操作层.图计算层.API层.应用层.核心层,设备层.网络层.数据操作层.图计算层.最下层是网络通信层和设备管理层.网络通信层包括gRPC(google Remo ...
- 系统架构-设计模式(适配器、观察者、代理、抽象工厂等)及架构模式(C/S、B/S、分布式、SOA、SaaS)(干货)
博客园首页是需要分享干货的地方,今天早上写的<HRMS(人力资源管理系统)-从单机应用到SaaS应用-系统介绍>内容下架了,所以我就按照相关规定,只分享干货,我把之前写完的内容整理发布上来 ...
随机推荐
- Python黑帽编程2.2 数值类型
Python黑帽编程2.2 数值类型 数值类型,说白了就是处理各种各样的数字,Python中的数值类型包括整型.长整型.布尔.双精度浮点.十进制浮点和复数,这些类型在很多方面与传统的C类型有很大的区 ...
- Vivado SDK 2014.2 创建新工程后,BSP版本不对的解决办法
问题描述如下: 1. 使用Vivado SDK 2014.2已经创建了工程,但是此时,hdf文件增加了外设,需要重新创建工程以更新SDK中的外设描述: 2. 使用新的hdf创建工程后,发现system ...
- C#设计模式之组合
IronMan之组合 在上个篇幅中讲到怎么把“武器”装饰到“部件”上,这个篇幅呢,还是要讲到“武器”,不过呢是关于“武器”使用的. 本篇介绍"武器"的合理使用方式,不说废话,直接来 ...
- 老司机学Xamarin系列总目录
Xamarin开发环境及开发框架初探 Xamarin Forms开发框架二探 (Prism vs MvvmCross) Xamarin Forms开发框架之MvvmCross插件精选 Xamarin开 ...
- 移动APP服务端设计开发注意要点
2014年,移动APP的热度丝毫没有减退,怎么为您的移动端app设计良好的服务器端接口(API)呢? 下面谈谈我个人的一些想法. 2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-5 从跟踪器中获取实体 问题 你想创建一个扩展方法,从跟踪器中获取实体,用于数 ...
- Qt Disable QDebug And Warning Output
如何禁止qDebug的输出 在项目开发的过程中,为了开发方便,我们常常在Qt的Application Output中输出一些内容,慢慢的. 有些qDebug就会被我们遗忘再角落里. 虽然对整个程序影响 ...
- 【原】安装Win7和Ubuntu双系统后,Win7耳机无声音的解决办法
最近安装了Ubuntu的桌面版,作成了双系统,可是发现了一个问题:进入Win7后有时插耳机会没有声音,外放有声音.后来更新驱动也没有解决问题,最后在网上查到了解决办法. 产生原因:进入Ubuntu后, ...
- 2013 duilib入门简明教程 -- XML配置界面(6)
前面那些教程都是为了让小伙伴们从win32.MFC过渡到duilib,让大家觉得duilib不是那么陌生,如果大家现在还对duilib非常陌生的话,那就说明前面的教程做得不好,请大家在下面留言 ...
- Unix及类Unix系统文本编辑器的介绍
概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...