将遗留系统分解为微服务:第 2 部分

在当今不断发展的技术环境中,从整体架构向微服务的转变对于许多企业来说都是一项战略举措。这在报销计算系统领域尤其重要。正如我在上一篇文章第 1 部分应用 Strangler 模式将遗留系统分解为微服务-CSDN博客中提到的,让我们探讨如何有效管理这种转变。

整体挑战

想象一个场景,您有一个大规模的整体系统 - 可能是一个庞大的 C# 控制台应用程序或一个广泛的 SQL Server 存储过程。该系统的任务是执行报销计算,通常通过 SQL Server 中安排的批处理过程过夜运行。虽然功能强大,但这种单一方法通常会带来可扩展性、灵活性和维护方面的挑战。

转向微服务

迁移到微服务的目标是将这个大型、复杂的系统分解为更小、更易于管理的组件。向微服务架构的过渡旨在利用云的优势,包括可扩展性、资源优化和成本效益。

迁移步骤

1. 理解系统

首先从现有的整体应用程序定义数据模型,以了解其工作流程、依赖关系以及报销计算过程的关键组件。该系统的源数据通过837 文件 ,这是医疗保健索赔信息的标准化电子格式。提取该文件并通常通过另一个加载过程将数据加载到数据库中以用于报销计算。例如,837 文件中的一些数据模型可能如下所示:

public class Patient
{public string Name { get; set; }public DateTime DateOfBirth { get; set; }public string Address { get; set; }public string Gender { get; set; }public string PatientId { get; set; }
}public class Provider
{public string Name { get; set; }public string Address { get; set; }public string NPI { get; set; }public string TaxID { get; set; }public string RenderingProvider { get; set; }
}public class Claim
{public string ControlNumber { get; set; }public DateTime ServiceFromDate { get; set; }public DateTime ServiceToDate { get; set; }public string TypeOfBill { get; set; }public string AdmissionType { get; set; }public string DischargeStatus { get; set; }public List<string> DiagnosisCodes { get; set; }public List<string> ProcedureCodes { get; set; }
}public class Insurance
{public string PayerName { get; set; }public string PayerAddress { get; set; }public string PayerId { get; set; }public string SubscriberInformation { get; set; }public string SubscriberId { get; set; }public string CoordinationOfBenefitsData { get; set; }
}public class ServiceLine
{public string RevenueCode { get; set; }public DateTime ServiceDate { get; set; }public int ServiceUnits { get; set; }public decimal ServiceCharges { get; set; }public List<string> ServiceModifiers { get; set; }
}

2. 识别微服务

将整体流程分解为更小的、逻辑上独立的服务。每个微服务应代表报销计算的特定方面,例如输入验证、计算逻辑和输出生成。在许多情况下,医疗报销系统可能涉及多个微服务协同工作以提供端到端功能。以下是一些可能成为综合医疗报销系统一部分的微服务:

图片

出于演示目的,我将提供报销计算服务的简化实现。假设患者信息、程序详细信息和费用表数据是从各自的微服务中检索的,并作为输入传递到此服务,Reimbursement.web 层 :


using Microsoft.AspNetCore.Mvc;
using Reimbursement.Service;namespace Reimbursement.Controllers
{[Route("api/[controller]")][ApiController]public class ReimbursementController : ControllerBase{private IReimbursementService _reimbursementService;public ReimbursementController(IReimbursementService reimbursementService){_reimbursementService = reimbursementService;}[HttpPost("calculate")]public ActionResult<decimal> CalculateExpectedReimbursement(Patient patient, Procedure procedure, FeeSchedule feeSchedule){try{decimal expectedReimbursement = _reimbursementService.CalculateExpectedReimbursement(patient, procedure, feeSchedule);return Ok(expectedReimbursement);}catch (Exception ex){return StatusCode(500, $"Internal server error: {ex.Message}");}}}
}

报销服务层:


using System;namespace Reimbursement.Service
{public class ReimbursementService : IReimbursementService{public decimal CalculateExpectedReimbursement(Patient patient, Procedure procedure, FeeSchedule feeSchedule){// Check if the patient and procedure existif (patient == null || procedure == null){throw new ArgumentNullException("Patient and Procedure must be provided.");}// Check if the feeSchedule existsif (feeSchedule == null){throw new ArgumentNullException("FeeSchedule must be provided.");}// Calculate the expected reimbursementdecimal expectedReimbursement = feeSchedule.Fee; // Basic reimbursement logic// You can add more complex reimbursement calculations here based on patient data and rulesreturn expectedReimbursement;}}
}

医疗报销系统中微服务的确切组成和架构可能会根据应用程序的特定需求和规模而有所不同。上面列出的服务是可以成为此类系统一部分的组件示例,它们可以通过 API 或消息队列相互交互以执行端到端报销流程。

3. 云端批处理

使夜间批处理适应云环境。这可能涉及利用云原生服务来执行计划任务,确保流程可靠且可扩展。CalculationService 也可以通过用户界面手动触发,以防用户仅需要为特定帐户重新运行,以便可以在批处理以外的地方重用该服务。

结论

将复杂的单一报销计算系统迁移到微服务并将其部署在云中是一个变革性的步骤。这种方法不仅使系统现代化,而且在可扩展性、资源利用率和成本节约方面带来了显着的好处,使系统与现代云功能保持一致,并且业务目标。


作者:Greg Hall

更多技术干货请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

irds.cn,多数据库管理平台(私有云)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/297911.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为设备VRP系统管理

为了满足企业业务对网络的需求&#xff0c;网络设备中的系统文件需要不断进行升级。另外&#xff0c;网络设备中的配置文件也需要时常进行备份&#xff0c;以防设备故障或其他灾害给业务带来损害。在升级和备份系统文件或配置文件时&#xff0c;经常会使用FTP和TFTP来传输文件。…

vue3项目 - 目录调整

省流 删除默认文件&#xff0c;修改代码 ---> 调整目录结构 ---> 添加全局样式和图片&#xff0c;安装预处理器 具体步骤&#xff1a; 1. 删除初始化的默认文件&#xff0c;修改剩余代码 清空 assets、components、stores、views文件夹里的文件&#xff0c;仅留核心文件…

四. 基于环视Camera的BEV感知算法-PETR

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比5. PETRv2总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基…

2023年12月24日学习总结

今日to do list&#xff1a; 做kaggle上面的流量预测项目☠️ 学习时不刷手机&#x1f921; okkkkkkkkkkkkkk 开始&#x1f44d;&#x1f34e; 0、我在干什么&#xff1f; 我在预测一个名字叫做elborn基站的下行链路流量&#xff0c;用过去29天的数据预测未来10天的数据 1、…

python调用DALL·E绘画

实现用gpt的api和他对话后&#xff0c;我们试着调用DALLE的api进行绘画 参考文档 OpenAI API 运行代码 from openai import OpenAIclient OpenAI()user_prompt input("请输入您想生成的图片描述: ")response client.images.generate(model"dall-e-3"…

MySQL数据库增删改查

常用的数据类型&#xff1a; int&#xff1a;整数类型&#xff0c;无符号的范围【0&#xff0c;2^32-1】&#xff0c;有符号【-2^31,2^31-1】 float&#xff1a;单精度浮点&#xff0c;4字节64位 double&#xff1a;双精度浮点&#xff0c;8字节64位 char&#xff1a;固定长…

软件测试5未来大发展路线,测试工程师发展偏向

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件测试的五大…

ubuntu docker 进入容器内使用ping 指令,提示bash: ping: command not found问题

解决方法 #更新软件列表 apt update #安装 ping 工具iputils-ping apt install -y iputils-ping #最后使用ping一下容器ping 172.18.0.3欢迎关注我的公众号“点滴分享技术猿”&#xff0c;原创技术文章第一时间推送。

leetcode 371. 两整数之和(优质解法)

链接&#xff1a;371. 两整数之和 代码&#xff1a; class Solution {public int getSum(int a, int b) {while(b!0){int numa^b; //无进位值int bit(a&b)<<1; //进位anum;bbit;}return a;} } 题解&#xff1a; 要计算两个数相加并且不能使用 - 号&#xff0…

MyBatis-Plus中默认方法对应的SQL到底长啥样?

我希望成为&#xff1a;自媒体圈中技术最好、实战经验最丰富的达人&#xff0c;技术圈中最会分享的架构师。加油&#xff01; 我的公众号&#xff1a;Hoeller 过段时间要给公司同事做Mybatis-Plus相关的培训&#xff0c;所以抓紧时间看看Mybatis-Plus的源码&#xff0c;顺便也分…

Kubernetes 架构原则和对象设计

什么是 Kubernetes Kubernetes 是谷歌开源的容器集群管理系统 • 基于容器的应用部署、维护和滚动升级&#xff1b; • 负载均衡和服务发现&#xff1b; • 跨机器和跨地区的集群调度&#xff1b; • 自动伸缩&#xff1b; • 无状态服务和有状态服务&#xff1b; • 插件机制…

线程的同步与互斥

抢票的例子 竞争过程 进程A被切走 进程B被切走 结论&#xff1a; 互斥 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); mutex: 指向要初始化的互斥锁的指针。attr: 用于设置互斥锁属性的指针&#xff0c;通常可以传入 NULL 以使用默认属性…