首页 文章 精选 留言 我的

精选列表

搜索[Service Mesh],共10000篇文章
优秀的个人博客,低调大师

Service-oriented architecture (SOA)

SOA 与 REST很多相同之处,目前SOA主要是基于SOAP实现,也有基于MQ的实现。而REST只限于HTTP POST/GET/PUT/DELETE等等。 我个人比较喜欢机遇TCP的SOA实现,不喜欢SOAP大量XML传输。 15.4.1.SOAP实现 这里提供一个简单的机遇SOAP实现的SOA框架 index.php入口文件 <?php define ('CONFIG_DIR', '../config/'); define ('LIBRARY_DIR', '../library/'); define ('DEBUG', false); //define ('DEBUG', ture); require_once(CONFIG_DIR. 'default.php'); $remote_addr = $_SERVER['REMOTE_ADDR']; if(!in_array($remote_addr, $firewall)) { printf("Permission denied: %s", $remote_addr); exit(0); } $request_uri = $_SERVER['REQUEST_URI']; $classspath = LIBRARY_DIR.strtolower($request_uri) . '.class.php'; if( is_file($classspath) ){ require_once($classspath); }else{ die("Cannot loading interface!"); } $class = ucfirst(substr($request_uri, strrpos($request_uri, '/')+1)); if( DEBUG ){ printf("%s<br>",$class); } if (class_exists($class)) { $server = new SoapServer(null, array('uri' => "http://webservice.example.com")); $server->setClass($class); $server->handle(); }else{ die('Object isnot exist.'); } 接口文件 <?php require_once('common.class.php'); class Members extends Common{ private $dbh = null; public function __construct() { parent::__construct(); $this->dbh = new Database('slave'); } public function getAllByUsernameAndMobile($username,$mobile){ $result = array(); if(empty($username) or empty($mobile)){ return($result); } $sql = "SELECT username, chinese_name, sex FROM members m, members_digest md WHERE m.id = md.id and m.username= :username and md.mobile = md5( :mobile );"; $stmt = $this->dbh->prepare($sql); $stmt->bindValue(':username', $username); $stmt->bindValue(':mobile', $mobile); $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); return($result); } public function getAllByLimit($limit,$offset) { $sql = "SELECT username FROM members limit ".$limit.",".$offset; $stmt = $this->dbh->query($sql); while ($row = $stmt->fetch()) { //printf("%s\r\n", $row['username']); $result[] = $row['username']; } return $result; } function __destruct() { $this->dbh = null; } } 客户端调用实例 <?php $options = array('uri' => "http://webservice.example.com", 'location'=>'http://webservice.example.com/members', 'compression' => 'SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP', 'login'=>'neo', 'password'=>'chen', 'trace'=>true ); $client = new SoapClient(null, $options); try { print_r($client->getAllByUsernameAndMobile('280600086','13113668890')); print_r($client->getAllByLimit(20,20)); } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } Nginx 虚拟主机配置文件 /etc/nginx/conf.d/webservice.example.com.conf server { listen 80; server_name webservice.example.com; charset utf-8; access_log /var/log/nginx/webservice.example.com.access.log main; auth_basic "Login"; auth_basic_user_file htpasswd; location / { root /www/example.com/webservice.example.com/htdocs; index index.html index.php; if ($request_filename !~ (js|css|images|robots/.txt|.*\.html|index/.php) ) { rewrite ^/(.*)$ /index.php/$1 last; break; } } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ /index.php/ { root /www/example.com/webservice.example.com/htdocs; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /www/example.com/webservice.example.com/htdocs$fastcgi_script_name; include fastcgi_params; } } 每增加一个功能需求,在library中创建一个 Class 文件即可。 index.php 有IP过滤功能,禁止非法IP访问 客户端采用压缩传输,节省xml传输开销 Nginx 设置了HTTP认证,防止他人探测,另外提示你还可以采用双向SSL认证。 15.4.2.MQ 实现 原文出处:Netkiller 系列 手札 本文作者:陈景峯 转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

优秀的个人博客,低调大师

aws 创建基于vpc的elasticsearch service

1.创建vpc 2.创建安全组 3.创建elasticsearch域 (1)选择elasticsearch版本 (2)配置集群和存储。建议启用2个专用主节点,增加可用性。实例类型根据需要来选择 (3)设置访问权限。这里选择在第一步和第二步中创建的vpc和安全组 (4)设置访问策略。这里选择请勿要求使用IAM凭证对请求签名。 (5) 设置安全组 因为aws上的elasticsearch地址是相当于一个负载均衡,后端的elasticsearch的9200端口是访问不到的。这里安全组设置的时候,选择所有流量,然后针对内网ip进行开放 本文转自 shouhou2581314 51CTO博客,原文链接:http://blog.51cto.com/thedream/2047881,如需转载请自行联系原作者

优秀的个人博客,低调大师

🎉 DDD as a Service | Wow v3.11.3 发布

领域驱动|事件驱动|测试驱动|声明式设计|响应式编程|命令查询职责分离|事件溯源 官方文档:https://wow.ahoo.me/ 更新内容 特性 (core): 添加RecoverAggregateAPI 以支持恢复已删除的聚合根。 特性 (core): 添加generateGlobalId便捷的生成全局 ID。 特性 (core):SimpleServiceProvider支持Copy。 特性 (test): 在测试编排fork后使用复制的ServiceProvider作为上下文,以防止不同的测试编排上下文依赖注入混乱。 特性 (test):fork支持自定义新上下文ServiceProvider和CommandAggregateFactory。 特性 (test): 添加functionFilter以支持单个Saga中的多个函数订阅同一事件。 简介 Wow是一个基于领域驱动设计和事件溯源的现代响应式CQRS微服务开发框架,历经多年生产环境验证。 旨在帮助开发者构建现代化的、高性能且易于维护的微服务应用程序,充分发挥领域驱动设计和事件溯源等模式优势的同时降低应用的复杂性以及实践成本。 值得一提的是,领域驱动设计和事件溯源并非微服务架构的专属,Wow框架不仅适用于微服务开发,同样也可用于构建基于领域驱动设计的单体应用程序。 快速开始 使用 Wow 项目模板快速创建基于 Wow 框架的 DDD 项目 特性概览 架构图 背景 随着业务的发展和复杂性的增加,传统的架构和开发方式逐渐显露出瓶颈。领域驱动设计和事件溯源等理念在提高系统设计的灵活性和可维护性方面表现出色,但在实践中常常需要面对复杂性和学习曲线的挑战。 Wow框架的目标是以简单易用的方式将领域驱动设计和事件溯源等理念融入到微服务应用开发中,降低开发者的学习成本,提高开发效率。 通过提供现代响应式的CQRS架构和相关组件,Wow框架旨在让开发者更专注于业务逻辑的实现,而不必过多关心底层技术细节。 经过多年的实践和不断的演进,Wow框架在生产环境中得到了验证,积累了丰富的经验。这些经验和反馈不仅丰富了框架的功能和性能,也为持续的改进和优化提供了宝贵的指导。 对于开发者而言,Wow框架意味着什么? 我曾告诫我的团队:如果我们过于依赖数据驱动设计而忽视领域驱动设计,我们最终将沦为CRUD工程师。 CRUD工程师的竞争力和可替代性可想而知,这或许是为何会有35岁效应,企业显然更倾向于招募没有太多生活羁绊、更加廉价的25岁CRUD工程师。 业务价值 软件系统的核心价值体现在业务价值上,研发人员不应只关注技术实现上,而是应该更多地关注业务价值的实现。 这其中的好处显而易见,当你开发完一个业务系统之后,你将变成一个业务专家,甚至比跟你合作的领域专家还要专业,因为你需要洞察业务细节。 使用Wow框架,意味着你将关注点放在围绕领域模型设计上,与业务专家一起探索业务领域,而不是关注于技术实现上。 你仅需编写领域模型,即可完成服务开发,Wow框架自动为你准备好OpenAPI接口。 在《实现领域驱动设计》一书中,作者 Vaughn Vernon 提到:核心域才值得投入精力进行领域驱动设计, 但如果你使用Wow框架,你将发现,因为低廉开发成本、快速的开发效率,即使是次要的支撑子域也值得DDD。 性能与伸缩性 随着业务的发展,你需要开始思考系统的性能和伸缩性问题。 在传统架构中,这牵扯到数据库关系模式、分片规则等复杂问题,同时你还需要处理因数据库分片导致的跨分片事务问题。 这时,你不得不修改你的业务代码,以适应水平拆分后的数据库架构。 然而,如果你选择使用Wow框架,你将不再需要过多关注数据库关系模式、分片规则等问题。你的业务代码无需变更,系统能够轻松实现水平伸缩。 你可以在这里了解更多关于Wow 框架的性能。 读写分离与同步延迟 读写分离是一种极为普遍的性能优化架构模式。 然而,同步延迟问题常伴随而来,事务执行成功后写库落库成功,但读库同步延迟,用户刷新页面后无法获取最新数据,从而对用户的体验产生影响。例如: 用户发起下单事务,写库执行成功,但由于某种原因,读库同步延迟,用户刷新页面后发现订单未成功创建。 商家编辑完商品后,同步到Elasticsearch索引库,但由于某种原因,同步延迟,导致商家刷新页面后搜索不到该商品。 通常,大家采用最简便的方法,等待 1 秒后刷新页面。 虽然这种方式能解决大多数数据同步延迟的问题,但效率不够高。 因为大多数情况下,同步在 100 毫秒内就已完成,剩余的 900 毫秒成了浪费。 然而,有时 1 秒无法完成同步,这就导致用户获取的数据变得无效。 使用Wow框架,你可以通过等待PROJECTED信号完成,然后再将结果返回给用户,以更为优雅和高效的方式处理数据同步延迟的问题。 工程质量 单元测试是确保代码质量且符合预期业务需求的重要手段,但在传统架构中,单元测试往往是一项相当困难的任务,因为你需要考虑数据库连接、事务管理、数据清理等问题。 使用Wow框架,你将会发现基于Given->When->Expect模式的测试套件,使得单元测试变得异常简单。 你只需关注领域模型是否符合预期,而无需为数据库连接等问题烦恼。 在实际应用中,我们将领域模型的单元测试覆盖率下限阈值设置为85%,也是可以轻松实现的。 在没有刻意要求的情况下,开发人员甚至自觉地将覆盖率提升至95%。 因此,每次提交代码都变得轻松自在,因为你确信你的代码经过了充分的测试,并且真正意义上从单元测试中获得了收益。 在研发同级别的项目中,我们的测试团队在系统API测试中发现,基于 Wow 框架的项目,其BUG数仅为传统架构项目的1/3。 你可以在这里了解更多关于Wow 单元测试套件。 对于企业而言,Wow框架意味着什么? 商业智能 商业智能是企业决策的关键支持,而数据则是商业智能的分析原料。业务数据越为丰富有价值,商业智能的分析结果越准确,决策也就更加可靠。 与传统架构有着显著差异,Wow提供了实时聚合根状态事件(StateEvent)和聚合命令(Command)作为数据分析的数据源,同时极大降低了实时ETL(Extract,Transform,Load)的难度。 在传统架构中,实现实时ETL通常需要经过繁琐的流程,包括DB->CDC->Process->DB,而在Wow框架中,仅需一段简单的SQL脚本即可完成这一过程。 另外,在传统架构中,使用CDC(MySql Binlog)数据仅记录数据的变化,缺乏明确的业务语义。进行业务分析时,需要基于数据状态的变化推断出业务语义,这往往需要进行大量的数据处理。 相较之下,Wow框架直接提供了聚合根状态事件和聚合命令作为数据分析的数据源,极大降低了数据处理的难度。 Wow提供的实时同步机制将数据实时同步至数据仓库(ClickHouse),为实时数据分析提供了极大的便利。这种方法为商业智能提供了强有力的支持,构建了一个实时数据分析系统,使决策制定能够基于及时而准确的信息。 你可以在这里了解更多关于Wow 商业智能。 操作审计 操作审计是企业中保障安全性和合规性的重要组成部分,同时也是对系统操作进行监控和追踪的关键手段。Wow框架在这方面为企业带来了显著的优势。 通过记录聚合命令(Command)作为操作审计的数据源,Wow框架能够详细追踪系统中的各种操作。 这些记录不仅包含了操作本身的内容,还涵盖了操作触发的副作用(领域事件),为审计提供了更为全面和准确的数据基础。 相较于传统审计方法,Wow框架的操作审计的数据源具备更加明确的业务语义,以及操作后产生的明确领域事件。 此外,Wow 框架提供的实时数据同步机制也为操作审计带来了便利,确保了审计数据的及时性和一致性。 了解更多关于Wow 操作审计。

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册