异构(兼容dubbo)SOA系统架构(.net)优化升级

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 原文:异构(兼容dubbo)SOA系统架构(.net)优化升级前面一片文章已经提到我司的异构(兼容dubbo)SOA系统架构,解决了不少技术痛点,也还算比较完善,也顺利推广开来。 但作为项目的开发者,自己产品的问题心里是清楚的,离自己满意还是有不小的距离。
原文: 异构(兼容dubbo)SOA系统架构(.net)优化升级

前面一片文章已经提到我司的异构(兼容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 = 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提高使用体验

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

 
二、日志配置
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、多种容错算法和多种负载均衡算法可供配置
 
   等我完成手头其他更紧急的工作,将准备启动下一版本的开发
 
 
相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
7天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
31 1
|
17天前
|
监控 API 开发者
后端开发中的微服务架构实践与优化
【10月更文挑战第17天】 本文深入探讨了微服务架构在后端开发中的应用及其优化策略。通过分析微服务的核心理念、设计原则及实际案例,揭示了如何构建高效、可扩展的微服务系统。文章强调了微服务架构对于提升系统灵活性、降低耦合度的重要性,并提供了实用的优化建议,帮助开发者更好地应对复杂业务场景下的挑战。
17 7
|
1月前
|
分布式计算 大数据 Serverless
云栖实录 | 开源大数据全面升级:Native 核心引擎、Serverless 化、湖仓架构引领云上大数据发展
在2024云栖大会开源大数据专场上,阿里云宣布推出实时计算Flink产品的新一代向量化流计算引擎Flash,该引擎100%兼容Apache Flink标准,性能提升5-10倍,助力企业降本增效。此外,EMR Serverless Spark产品启动商业化,提供全托管Serverless服务,性能提升300%,并支持弹性伸缩与按量付费。七猫免费小说也分享了其在云上数据仓库治理的成功实践。其次 Flink Forward Asia 2024 将于11月在上海举行,欢迎报名参加。
160 1
云栖实录 | 开源大数据全面升级:Native 核心引擎、Serverless 化、湖仓架构引领云上大数据发展
|
21天前
|
存储 消息中间件 人工智能
ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用
本文整理自2024年云栖大会阿里云智能集团高级技术专家金吉祥的演讲《ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用》。
|
19天前
|
运维 监控 Serverless
利用Serverless架构优化成本和可伸缩性
【10月更文挑战第13天】Serverless架构让开发者无需管理服务器即可构建和运行应用,实现成本优化与自动扩展。本文介绍其工作原理、核心优势及实施步骤,探讨在Web应用后端、数据处理等领域的应用,并分享实战技巧。
|
19天前
|
Cloud Native API 持续交付
利用云原生技术优化微服务架构
【10月更文挑战第13天】云原生技术通过容器化、动态编排、服务网格和声明式API,优化了微服务架构的可伸缩性、可靠性和灵活性。本文介绍了云原生技术的核心概念、优势及实施步骤,探讨了其在自动扩展、CI/CD、服务发现和弹性设计等方面的应用,并提供了实战技巧。
|
22天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
54 3
|
27天前
|
存储 运维 监控
高效运维管理:从基础架构优化到自动化实践
在当今数字化时代,高效运维管理已成为企业IT部门的重要任务。本文将探讨如何通过基础架构优化和自动化实践来提升运维效率,确保系统的稳定性和可靠性。我们将从服务器选型、存储优化、网络配置等方面入手,逐步引导读者了解运维管理的核心内容。同时,我们还将介绍自动化工具的使用,帮助运维人员提高工作效率,降低人为错误的发生。通过本文的学习,您将掌握高效运维管理的关键技巧,为企业的发展提供有力支持。
|
29天前
|
存储 消息中间件 运维
架构升级的救星!流量回放自动化测试的必备指南
大家好,我是小米,一名29岁的技术宅。今天分享一个物联网领域的实用技能——流量回放自动化测试。系统重构后,测试工作量巨大,本文介绍如何通过日志收集和数据回放进行自动化测试,包括离线、实时和并行回放模式,帮助快速定位Bug,提升测试效率和系统稳定性。欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
35 3
|
27天前
|
存储 SQL 缓存
Apache Doris 3.0 里程碑版本|存算分离架构升级、湖仓一体再进化
从 3.0 系列版本开始,Apache Doris 开始支持存算分离模式,用户可以在集群部署时选择采用存算一体模式或存算分离模式。基于云原生存算分离的架构,用户可以通过多计算集群实现查询负载间的物理隔离以及读写负载隔离,并借助对象存储或 HDFS 等低成本的共享存储系统来大幅降低存储成本。
Apache Doris 3.0 里程碑版本|存算分离架构升级、湖仓一体再进化