欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
  六边形架构是一种设计风格,通过分层实现核心逻辑与外部对象隔离。其核心逻辑是业务模块,外部元素是整合点,比如数据库、外部 API、界面等。它将软件分为内部与外部,内部包含了核心业务逻辑与领域层(所谓分层架构),外部包含界面、数据库、消息传递及其他内容。内部与外部通过端口和适配器相互通信。
 
  *译注:六边形架构(Hexagonal Architecture)由Alistair Cockburn 提出,解决了传统的分层架构所带来的问题。*
 
  1. 优点
 
  使用六边形架构开发的软件与通道独立,因此能支持多通道
 
  易于置换入站和出站整合点
 
  测试软件变得更简单,因为可以很容易地模拟集成点
 
  2. Java 实现
 
  按照上面的描述,六边形架构更多地是围绕端口和适配器开展工作。在 Java 中,用 interface 定义端口,实现类作为适配器。下面用一个简单的 Spring Boot 应用示例了解如何应用六边形架构。
 
  示例应用主要功能是创建并查看雇员信息,核心业务逻辑在 ——EmployeeService—— 中实现,领域对象定义为 ——Employee—— ,这些都可以看做内部模块。
 
  **EmployeeService.java**
 
  ——java
 
  @Service
 
  public class EmployeeService {
 
  @Autowired
 
  private EmployeeRepositoryPort employeeRepository;
 
  public void create(String name, String role, long salary){
 
  employeeRepository.create(name, role, salary);
 
  }
 
  public Employee view(Integer userId){
 
  return employeeRepository.getEmployee(userId);
 
  }
 
  }
 
  ——
 
  **Employee.java**
 
  ——java
 
  @Entity
 
  @Table(name = "employee")
 
  public class Employee{
 
  @Id
 
  @GeneratedValue
 
  @Column(name = "id")
 
  private Integer id;
 
  @Column(name = "name", nullable = false)
 
  private String name;
 
  @Column(name = "role", nullable = false)
 
  private String role;
 
  @Column(name = "salary", nullable = false)
 
  private long salary;
 
  // Setter、Getter 方法
 
  }
 
  ——
 
  现在,示例应用可以通过 REST 或消息机制提供服务。创建实现了 ——EmployeeUIPort—— 接口的——EmployeeControllerAdapter—— 类提供 REST 服务。
 
  **EmployeeControllerAdapter.java**
 
  ——java
 
  RestController
 
  @RequestMapping("/employees/")
 
  public class EmployeeControllerAdapter implements EmployeeUIPort{
 
  @Autowired
 
  private EmployeeService employeeService;
 
  @Override
 
  public void create(@RequestBody Employee request) {
 
  employeeService.create(request.getName(), request.getRole(), request.getSalary());
 
  }
 
  @Override
 
  public Employee view(@PathVariable Integer id) {
 
  Employee employee = employeeService.view(id);
 
  return employee;
 
  }
 
  }
 
  ——
 
  ——java
 
  public interface EmployeeUIPort {
 
  @PostMapping("create")
 
  public void create(@RequestBody Employee request);
 
  @GetMapping("view/{id}")
 
  public Employee view(@PathVariable Integer userId);
 
  }
 
  ——
 
  作为业务逻辑的一部分,——EmployeeService—— 还需要调用外部 DB 集成点。因此,我们创建了——EmployeeRepositoryPort—— 以及实现了该接口的 ——EmployeeServiceAdapter——。
 
  **EmployeeServiceAdapter.java**
 
  ——java
 
  @Service
 
  public class EmployeeServiceAdapter implements EmployeeRepositoryPort {
 
  @PersistenceContext
 
  private EntityManager entityManager;
 
  @Transactional
 
  @Override
 
  public void create(String name, String role, long salary) {
 
  Employee employee = new Employee();
 
  employee.setName(name);
 
  employee.setRole(role);
 
  employee.setSalary(salary);
 
  entityManager.persist(employee);
 
  }
 
  @Override
 
  public Employee getEmployee(Integer userId) {
 
  return entityManager.find(Employee.class, userId);
 
  }
 
  }
 
  ——
 
  **EmployeeRepositoryPort.java**
 
  ——java
 
  public interface EmployeeRepositoryPort {
 
  void create(String name, String role, long salary);
 
  Employee getEmployee(Integer userId);
 
  }
 
  ——
 
  至此,我们可以看到 ——EmployeeService—— 是如何使用 ——EmployeeUIPort—— 端口提供服务,通过 ——EmployeeRepositoryPort—— 调用 DB 并通过 ——EmployeeControllerAdapter——和——EmployeeServiceAdapter—— 提供 REST API 服务。
 
  3. 总结
 
  总结一下,六边形架构是一种将应用划分成内外两部分的设计方法。通过内部公开的端口与外部实现的适配器进行沟通。应用这种方法,在保持核心用例代码不变的情况下,可以服务多个通道、支持多种不同协议。 不仅如此,它还能有效提高应用程序的可测性。尽管如此,不建议在整个应用中完全实现六边形架构,而是有选择地使用接口与适配器。

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h63075.shtml