前面一片文章已经提到我司的异构(兼容dubbo)SOA系统架构,解决了不少技术痛点,也还算比较完善,也顺利推广开来。

但作为项目的开发者,自己产品的问题心里是清楚的,离自己满意还是有不小的距离。

在推广的同时,我紧张的进入了下一个版本的开发,让它更加完善。

原来的版本号是1.0,现在版本升级为1.1且已经开发完成并发布(内部),本次升级主要内容如下:

1、修正了一些bug
2、简化了SOA使用
  强化IOC的作用,解耦对象关联性
  使用公司内部Nuget管理SOA及相关依赖
  简化方法调用及方法参数(尽量只保留必须的参数)
3、性能提升、cpu和线程资源占用适当下降
  高效异步线程,减少应用程序启动时间
  高效对象复用节省内存和cpu消耗
4、稳定性提升
  增加故障转移(出错的节点将会在负载均衡列表中移除,避免服务异常zookeeper未及时通知导致的大量报错)
  优化zookeeper连接状态检测和维护(连接中断及时重新连接)
  增加服务端优雅下线机制
5、强化配置
  增加了很多可选配置满足业务和性能需要
  可以对单个服务单独个性化配置
6、强化日志
  对SOA内部几乎每个组件和每个服务都可以配置单独的日志
  可以开启所有日志也可以选择性的开启部分日志
 
以上开发测试工作耗了三个多月,当然这里面包含一些基础建设工作,其意义不只是SOA受益,比如内部Nuget、日志、IOC容器优化,

 一、1.1版本使用控制台做服务端的例子
1、使用Nuget安装Fang.SOA
所有引用(含ZooKeeper和Thrift)一键搞定
2、其实要安装的东西还是挺多的,如果没有Nuget就会让人崩溃
3、不要被太多组件(dll)吓到,大部分dll很小的,都是独立的功能
注:大家可以看到以上截图是9月初的,开发完成时间实际是11月中旬;也就是说9月初设计完成且基本目标已经完成并调试通过,其后又经历漫长的两个多月不断得修改bug和优化;一路过来痛并快乐着,看着离自己的目标一步步越来越近。
4、服务端的代码非常简单
    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(扩展方法)来用即可

启动一个系统就变成了给该系统配置容器,可以通过文件配置也可以通过代码配置

5.4 有人可能说还少一堆配置,这全都默认值可不行
那些配置可以在appSettings中配置,每个服务还可以单独配置,提供了一堆IContainer的扩展方法来配置
把1.0例子中的配置全加上后的代码如下:
        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提高使用体验

其二、配置多元化了,代码配置不再是不二选择,必须写的代码更少了

 
二、日志配置
1、日志配置是本次升级的主要内容之一
一个容器扩展方法SOALog就可以搞所有SOA的日志记录,增加日志后的代码如下:
        static void Main(string[] args)
{
IContainer container = _container = new SimpleContainer()
.SOALoadSettings()//加载appSettings配置
.SOALog();//开启所有日志
CreateHelloWorld(container);//HelloWorld服务
container.SOAStart();//启动所有服务
Console.ReadLine();
}

2、开启日志默认效果如下:

这是我本地15号至今一直在跑的本地测试服务,日志文件稍微有点大,但是日志性能还是比较可靠的,全日志下几乎不影响高并发的执行耗时
对于每个服务都有单独的日志
默认按天分文件,当然也可以不记录文件,输出到控制台或者数据库等,这样的话就要配置了,配置一个日志工厂到容器中,超出本文范畴不再展开
 
3、能不能只开启部分日志
当然可以,提供了一堆日志配置方法(容器扩展方法),SOALog只是他们的总司令而已
呵呵,这么多款日志配置,总有一款适合你。
 
三、1.1版客户端的例子
1、直接上代码(nuget安装引用同服务端)
    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个服务,按轮询提供服务

 
五、畅想将来版本
前面基本把本次升级的内容展示出来,算是我比较满意的版本,其性能和稳定性已经不输java的dubbox。
但是我还有继续优化的冲动,也整理几点尚未实现但是我很期待的功能
1、完全容器配置支持
  就是类似dubbo一样在spring容器中配置一下就可以了
2、DI支持
  把服务工厂Aop封装为服务接口,直接DI服务接口对象到需要的地方,执行方法最开始获取一个真实对象,执行方法结束回收
3、多种容错算法和多种负载均衡算法可供配置
 
   等我完成手头其他更紧急的工作,将准备启动下一版本的开发
 
 

异构(兼容dubbo)SOA系统架构(.net)优化升级的更多相关文章

  1. 异构SOA系统架构之Asp.net实现(兼容dubbo)

    我们公司技术部门情况比较复杂,分到多个集团,每个集团又可能分为几个部门,每个部门又可能分为多个小组,组织架构比较复杂,开发人员比较多. 使用的编程语言也有点复杂,主流语言有.net(C#).Java. ...

  2. dubbo框架----探索-大型系统架构设计(图解)

    对于高并发系统的架构要求: 1. 负载均衡 2.高并发 3.高可用 4.面向服务架构 (Dubbo框架使用) 5.分布式缓存 (redis分布式缓存) 6.分布式全文检索 (solr分分布式全文检索) ...

  3. [转]系统架构演变--集中式架构-垂直拆分-分布式服务-SOA(服务治理)-微服务

    一.系统架构演变 1.1. 集中式架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键. 存在的 ...

  4. SOA的企业系统架构

    基于SOA的企业系统架构设计及IT治理日记 (引) TOGAF是一个架构框架,指导做企业架构的标准和方法,简而言之,是一种协助开发.验收.运行.使用和维护架构的工具,核心是架构开发方法(ADM)指导了 ...

  5. 基于Flume的美团日志收集系统 架构和设计 改进和优化

    3种解决办法 https://tech.meituan.com/mt-log-system-arch.html 基于Flume的美团日志收集系统(一)架构和设计 - https://tech.meit ...

  6. 高性能网站性能优化与系统架构(ZT)

    转载请保留出处:俊麟 Michael’s blog (http://space.itpub.net/7311285/viewspace-97) 我在CERNET做过拨号接入平台的搭建,而后在Yahoo ...

  7. SOA 新业务语言 新系统架构——什么是SOA

    原文地址:http://blog.csdn.net/ichaos/archive/2008/01/20/2054377.aspx SOA的概念是Gartner在1996年提出来的,并于2002年12月 ...

  8. 学习笔记TF048:TensorFlow 系统架构、设计理念、编程模型、API、作用域、批标准化、神经元函数优化

    系统架构.自底向上,设备层.网络层.数据操作层.图计算层.API层.应用层.核心层,设备层.网络层.数据操作层.图计算层.最下层是网络通信层和设备管理层.网络通信层包括gRPC(google Remo ...

  9. 系统架构-设计模式(适配器、观察者、代理、抽象工厂等)及架构模式(C/S、B/S、分布式、SOA、SaaS)(干货)

    博客园首页是需要分享干货的地方,今天早上写的<HRMS(人力资源管理系统)-从单机应用到SaaS应用-系统介绍>内容下架了,所以我就按照相关规定,只分享干货,我把之前写完的内容整理发布上来 ...

随机推荐

  1. Java NIO6:选择器2---代码篇

    选择器服务器端代码 上一篇文章毫无条理地讲了很多和选择器相关的知识点,下面进入实战,看一下如何写和使用选择器实现服务端Socket数据接收的程序,这也是NIO中最核心.最精华的部分. 看一下代码: p ...

  2. 如何在Visual Studio 工程之间共享静态内容 (js, css, img, etc.)

     第一步: 文件夹上点击右键 -> Add -> Existing Item,单击选中文件,不要点击“Add”按钮,而是在“Add”按钮右边有个向下的小箭头,点击这个箭头,再点击“Add ...

  3. Redhat环境下编译安装Google Bazel

    Redhat环境下编译安装bazel 作者:Jack47 目前Google Bazel没有提供各个操作系统下的二进制安装包,只提供源代码,需要我们自己编译安装,详情可以见我翻译的中文版Google B ...

  4. 开发必备的Windows小技巧

    在Windows中我们经常会遇到各种小问题,而这些小问题又确实在影响着工作效率,如果能解决这些小问题,那么就能在一定程度上提高工作效率,保证心情愉悦.今天我就来分享一下几个自认为比较有用的小技巧. 保 ...

  5. 新版C#编译器关于函数闭包的一处更改

    感谢@DiryBoy的补充,他提到这个问题在MSDN上是有说明的: http://msdn.microsoft.com/en-us/library/vstudio/hh678682.aspx 在Vis ...

  6. MySQL 复制表结构

    200 ? "200px" : this.width)!important;} --> 介绍 有时候我们需要原封不动的复制一张表的表结构来生成一张新表,MYSQL提供了两种便 ...

  7. C语言 · 动态数组的使用

    从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 5 3 4 0 0 2样例输出:9 1样 ...

  8. tomcat 的优化配置

    一.关于并发连接量的配置 在tomcat的server.xml配置文件中:将<Connector port="8080" protocol="HTTP/1.1&qu ...

  9. Publication的 immediate_sync 属性

    Publication的属性 immediate_sync 控制 Snapshot 文件的创建,如果属性 immediate_sync设置为true,那么snapshot file在snapshot ...

  10. TSQL Merge On子句和When not matched 语义理解

    Merge 的On子句指定Match condition,When子句指定过滤条件,如果Source Table和Targe Table匹配的上,很好理解:如果匹配不上,必须深入理解不匹配的条件,否则 ...