编写 运行 跨不同区域的代码
Writing code that run across different regions
我正在努力增强 Spring 启动微服务,该微服务是为英国地区的消费者注册而开发的。服务域模型和验证逻辑是根据英国的消费者注册详细信息进行编码的。微服务接受 UI 提供消费者的姓名、地址等,并 运行 在向系统注册消费者之前对其进行一些验证。
我必须为美国地区 运行 增强此服务。现有的域模型不适合美国。在英国,消费者的地址格式与美国不同。另外,英国地区没有SSN。英国和美国有不同的地址验证系统。
总的来说,我不能使用为美国地区开发的同一个微服务。我想问一下,考虑到域模型的差异以及与不同后端系统集成的要求(例如地址验证),我们如何开发跨不同地域工作的服务。
在一天结束时,我假设您对用户详细信息做了一些事情。因此,我认为最好的行动方案是开发一个适合所有区域需求的 user/address 域模型。
这很有可能。例如,参见 How should international geographical addresses be stored in a relational database?。
保持简单。
这取决于领域模型的深度。如果域模型仅存在于微服务级别,那么微服务级别的更改将修复它,但是,如果域模型一直深入到核心系统,那么微服务级别的更改将只是一个带-最好的帮助。
问题不仅在于数据的处理方式,还在于数据在后端/核心系统中的存储方式。
在计划更改以适应美国时,可能值得询问一下以后添加其他地区的可能性有多大。这并不是说您想立即开始过度设计(YAGNI 等),但同时它可能会帮助您选择不会让自己陷入困境的选项。
回答您的实际问题:
...how do we develop Services that works across different geographies
considering differences in the domain model and requirement for
integration with different back-end systems (address validation for
example).
这里有几个选项。这些有一些变化,但希望它们会给你一个好的开始:
选项A(左):单微服务中的逻辑
假设 UI(或调用微服务的任何东西)已确定需要哪个区域。在微服务中:
- 实现一个基于 Dependency Inversion Principle (DIP) 的系统,以便微服务中的某些东西(图中称为
Logic Loader
)可以加载正确的区域逻辑。
- 为每个区域编写单独的逻辑。这里的挑战是弄清楚如何以及在何处处理区域之间的不一致。通常对于 DIP 实现,您可能有一个提供者(区域逻辑)必须实现的接口。例如。
SaveDwellingNumber(int streetNumber, int level, int apartmentNumber)
但正如您马上就能看到的那样,强类型方法签名将不可能/容易实现。
- 使用另一个模块来整理数据中的任何差异,以便无论区域如何,来自微服务的数据都是一致的 - 这假设您的后端核心系统只有一种存储地址的方式。
根据 UI 的工作方式,区域逻辑系统处理的功能之一可能是告诉 UI 要显示哪些特定于区域的输入字段。
这个解决方案感觉有点脏,但它允许您处理不同的区域,同时向只有一种理解地址的后端系统提供一组统一的输出数据。
选项 B(右):分层微服务
这与其他选项的工作原理相同,但实施方式不同。
- 体验 API(可以是 API 网关或微服务上的 API)- UI(呼叫者)与之交谈。它的工作是为调用者提供单一一致的 API,并将调用路由/编排到适当的微服务。
- 英国/美国区域微服务 - 执行区域特定的繁重工作。
- 核心系统微服务,执行
consistency / mapper
在选项 A 中的作用。此微服务也是为核心系统提供保护的好地方,例如在性能较差时进行缓存。
比较
选项 B 可以让您更轻松地分离关注点,例如如果您的企业表示 'actually we might look at adding Cambodia and Latvia next year',那么这种方法可能会在未来为您提供更多选择,因为您可以合理地挤入单个微服务的内容有限。您还可以将相关微服务的实例部署到有意义的 *aaS 平台地理区域中。
如果您使用选项 A 弄清楚了您的逻辑和功能框架,您可以稍后将其重新构建为选项 B。选项 A 是一个更小、更简单的实现,因此最初构建速度更快,但很难说它能持续多久。
选项 B 更加细化,因此更容易让多个 people/teams 处理它的不同部分。
最后,只要这个答案是,它并没有真正解决不同数据中固有的挑战以及您需要什么逻辑,但它确实讨论了如何处理这种逻辑所在的微服务。
我正在努力增强 Spring 启动微服务,该微服务是为英国地区的消费者注册而开发的。服务域模型和验证逻辑是根据英国的消费者注册详细信息进行编码的。微服务接受 UI 提供消费者的姓名、地址等,并 运行 在向系统注册消费者之前对其进行一些验证。
我必须为美国地区 运行 增强此服务。现有的域模型不适合美国。在英国,消费者的地址格式与美国不同。另外,英国地区没有SSN。英国和美国有不同的地址验证系统。
总的来说,我不能使用为美国地区开发的同一个微服务。我想问一下,考虑到域模型的差异以及与不同后端系统集成的要求(例如地址验证),我们如何开发跨不同地域工作的服务。
在一天结束时,我假设您对用户详细信息做了一些事情。因此,我认为最好的行动方案是开发一个适合所有区域需求的 user/address 域模型。
这很有可能。例如,参见 How should international geographical addresses be stored in a relational database?。
保持简单。
这取决于领域模型的深度。如果域模型仅存在于微服务级别,那么微服务级别的更改将修复它,但是,如果域模型一直深入到核心系统,那么微服务级别的更改将只是一个带-最好的帮助。
问题不仅在于数据的处理方式,还在于数据在后端/核心系统中的存储方式。
在计划更改以适应美国时,可能值得询问一下以后添加其他地区的可能性有多大。这并不是说您想立即开始过度设计(YAGNI 等),但同时它可能会帮助您选择不会让自己陷入困境的选项。
回答您的实际问题:
...how do we develop Services that works across different geographies considering differences in the domain model and requirement for integration with different back-end systems (address validation for example).
这里有几个选项。这些有一些变化,但希望它们会给你一个好的开始:
选项A(左):单微服务中的逻辑
假设 UI(或调用微服务的任何东西)已确定需要哪个区域。在微服务中:
- 实现一个基于 Dependency Inversion Principle (DIP) 的系统,以便微服务中的某些东西(图中称为
Logic Loader
)可以加载正确的区域逻辑。 - 为每个区域编写单独的逻辑。这里的挑战是弄清楚如何以及在何处处理区域之间的不一致。通常对于 DIP 实现,您可能有一个提供者(区域逻辑)必须实现的接口。例如。
SaveDwellingNumber(int streetNumber, int level, int apartmentNumber)
但正如您马上就能看到的那样,强类型方法签名将不可能/容易实现。 - 使用另一个模块来整理数据中的任何差异,以便无论区域如何,来自微服务的数据都是一致的 - 这假设您的后端核心系统只有一种存储地址的方式。
根据 UI 的工作方式,区域逻辑系统处理的功能之一可能是告诉 UI 要显示哪些特定于区域的输入字段。
这个解决方案感觉有点脏,但它允许您处理不同的区域,同时向只有一种理解地址的后端系统提供一组统一的输出数据。
选项 B(右):分层微服务
这与其他选项的工作原理相同,但实施方式不同。
- 体验 API(可以是 API 网关或微服务上的 API)- UI(呼叫者)与之交谈。它的工作是为调用者提供单一一致的 API,并将调用路由/编排到适当的微服务。
- 英国/美国区域微服务 - 执行区域特定的繁重工作。
- 核心系统微服务,执行
consistency / mapper
在选项 A 中的作用。此微服务也是为核心系统提供保护的好地方,例如在性能较差时进行缓存。
比较
选项 B 可以让您更轻松地分离关注点,例如如果您的企业表示 'actually we might look at adding Cambodia and Latvia next year',那么这种方法可能会在未来为您提供更多选择,因为您可以合理地挤入单个微服务的内容有限。您还可以将相关微服务的实例部署到有意义的 *aaS 平台地理区域中。
如果您使用选项 A 弄清楚了您的逻辑和功能框架,您可以稍后将其重新构建为选项 B。选项 A 是一个更小、更简单的实现,因此最初构建速度更快,但很难说它能持续多久。
选项 B 更加细化,因此更容易让多个 people/teams 处理它的不同部分。
最后,只要这个答案是,它并没有真正解决不同数据中固有的挑战以及您需要什么逻辑,但它确实讨论了如何处理这种逻辑所在的微服务。