微服务开发以spring-boot和spring-cloud技术为基础框架,基于微服务架构的业务应用,建立场景全过程领域驱动模型,系统总体框架如下图所示。系统总体架构分为资源层、数据层、服务层、应用层和接入层。资源层基于一体化平台,提供云基础设施、云平台组件等基础资源;数据层基于全业务统一数据中心,提供数据存储服务;服务层由不同功能的微服务组成,为企业级应用提供业务逻辑处理、数据共享等服务;应用层由各种微应用组成,为用户提供相关业务功能的界面实现;接入层主要通过门口为用户提供统一人机交互入口。另外,云服务中心提供负载均衡、灰度发布、弹性伸缩、链路监控等相关支撑服务组件,支撑微服务、微应用的部署、运行和监控。
共享服务中心
基于微服务总体架构设计, 包括:用户中心、工单中心、账单中心、支付中心、订单中心、积分中心、在线客服中心、消息中心。共享服务中心是一种战略性业务架构,以客户服务和持续改进为内容,以构建价值导向的核心服务能力为目标,将原来分散在各业务支持系统中存在业务逻辑相同或相近的事务性工作和专业服务工作进行分离、重组、集合,并交由相应的机构、岗位人员来组织运营。通过资源重组,实现了为客户提供统一、专业、标准化的高效服务目标。
1)用户中心通过对用户身份数据、用户行为数据的沉淀,实现用户的统一注册、登录认证、授权等功能。
2)工单中心实现所有工单的统一指挥调度及全过程监控功能,包括工单生成、汇聚、分理、派发、处理、监控和查询分析等。
3)账单中心实现服务记录、业务费、等账单的集中展示、查询与管理,为客户提供电子账单的查询、订阅、下载、推送等服务,同时面向客户提供便捷的业务费的电子发票开具、查询、下载、订阅服务等功能。
4)支付中心按不同单位的需求,为客户提供银行卡、支付宝、微信、手机网银等多种支付方式,且支付中心定位各支付渠道的支付聚合,支付渠道统一接入,各支付渠道单独结算的功能。
5)订单中心实现商城商品销售、积分兑换、等各类型订单的统一下单和集中查询、管理等功能。
6)积分中心为用户提供统一积分接入、查询、兑换能力,对单位相关业务系统,实现积分的统一接入和统一管理,搭建积分兑换专区,支持兑换商品管理,开展
积分营销活动,实现积分统一兑换的运营管理等功能。
7)在线客服中心实现在线服务接入、在线自助服务、人工在线业务受理、自助工单审核、信息查询、业务回复评价、渠道消息推送等功能。共享服务中心实现了全网业务知识体系的统一管理与全局共享,支撑全渠道客户服务知识应用,满足全网营销服务人员以及外部客户对知识的应用需求。
8)消息中心提供统一的消息接入、监控、运营能力,提供多种消息发送渠道,同时支持消息模板设置、备用通道切换、渠道监控、流量控制、消息统计、运营管理等功能。
意义与目标
1)共享服务中心通过广泛应用分布式服务治理组件,分布式数据库组件、消息队列组件、全局事务组件、全链路监控组件等成熟互联网技术,将传统的竖状式客户资源进行在线资源整合,构建以客户为中心的现代服务体系,形成从电力供应商向综合能源服务商转型升级的发展模式。
2)采用微服务分布式架构,打破传统业务边界,使得前端应用以共享服务中心的形式提供核心业务能力,以客户视角重组业务场景,挖掘传统业务与新兴业务客户各类需求间的关联性关系,厘清各业务版块间价值链接点,按照不同服务场景,实现服务拆分及业务的重组,优化关联业务设计满足客户一键办理要求。同时,打通线上、线下全业务流程,建立“横向协同、纵向协作”的业务模式,确保线上、线下业务协同和信息互通和集中存储和共享。
3)基于微服务架构模式,大规模提升了数据处理服务能力,通过大规模、可扩展的并行计算框架,达成了海量数据存储及高性能计算分析能力的建设目标,基于应用平台实现数据共享和数据统一,实现互联网客户服务渠道的数据开发、两级交互共享及统一分析的战略格局,以数据为驱动对现有业务进行重构,实现数据的汇聚、融合、共享。总体架构的搭建在保证原有业务能力持续发挥作用的同时,也保证新业务能力的同步扩展,设计时充分考虑业务灵活、多变的特性,保证系统架构具备足够的业务扩展性和弹性伸缩能力,以便适应老业务模式向新业务模式演进时带来的变化,适应用户规模、用户使用方式和系统部署模式变化带来的影响,支撑新业务逐步扩展增加,实现创新支撑的建设目标。
Summary
通过采用以spring-boot和spring-cloud为技术框架的微服务架构模式,对业务应用进行改造,建立场景全过程领域驱动模型,全渠道应用于一体化平台。将业务功能复杂、耦合度高、系统维护成本大的系统改造为可独立部署、耦合度低、业务功能组件化的分布式系统,并保持着微服务架构简单性、避免分布式数据库事务、减少非必要的聚合服务;满足高负载服务拆分;避免业务应用过度拆分等三大原则。并且,业务应用各组成单元由一体化平台提供统一部署服务,将微服务、微应用等部署单元进行容器化,通过容器编排、负载均衡、弹性伸缩等组件完成各单元部署,满足业务应用的高可用、高性能、高并发需要。随着业务的不断发展,无论是新功能的增减还是业务逻辑的优化,业务系统都能够做到快速响应,敏捷开发,灵活配置,快速部署,独立运行,为业务的发展提供快速有力的支持。
如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame