wso2 esb部署 4.
加强基于Spring的微服务开发
当我们首次推出用于Java的WSO2微服务框架时,我们知道我们想快速跟进一个发行版,该发行版使开发人员能够利用Spring框架提供的易开发性以及RESTful的JAX-RS规范。 weWb服务。
当然,有些人可能想知道为什么当其他选项(例如Spring Boot)已经存在时,世界需要一个用于Spring的微服务框架。 但是,我们看到WSO2 MSF4J的小尺寸和高性能与Spring的敏捷性之间有着很好的协同作用。
考虑到这一点,本文研究了WSO2 MSF4J 2.0带给Spring的一些性能优势。 然后研究开发人员如何使用框架2.0版中的功能创建Spring服务。
为什么要基于Spring构建另一个微服务框架?
Spring Boot是用于构建Java微服务的流行框架。 那么,为什么我们还需要另一个支持Spring的微服务框架? MSF4J的主要设计目标包括:
- 快速启动
- 低内存占用
- 小包装
- 高吞吐量和低延迟
关于这些设计目标,让我们看一下MSF4J提供的一些优势。
通量
为了验证框架的性能,我们为性能测试微服务框架开发了一个基准 。 它包括一个简单的回显测试,该回显测试将回显请求消息。 它还包含I / O测试,该测试采用服务请求的形式,导致在发送回响应之前写入和读取文件。 然后,我们使用各自框架的默认配置运行WSO2 MSF4J和Spring Boot进行测试。 如下所示,MSF4J的吞吐量略高。
内存消耗
在运行基准测试时,我们还监视了两个框架的内存消耗。 WSO2 MSF4J在这里的表现优于Spring Boot,并在下面的两个图中得到了证明。 实际上,在单独的测试中,我们能够流传输大于1GB的文件,并且最大内存为WSO2 MSF4J分配了15MB。
潜伏
该基准还比较了两个框架的延迟。 下图显示了平均,中位数,第90个百分位数,第95个百分位数和第99个百分位数延迟的比较。
显然,在较低的并发下,两个框架都显示出相似的延迟特性。 但是,在更高的并发下,MSF4J显示出更好的延迟行为。
这是MSF4J 2.0与Spring Boot 1.3.5比较的摘要。
在Spring中使用WSO2 MSF4J 2.0微服务功能
WSO2 MSF4J支持Spring原生编程模型,该模型允许开发人员将Spring Bean编写为WSO2 MSF4J 微服务 , Interceptors , ExceptionMappers和配置,并在运行时进行连接。
要了解WSO2 MSF4J如何与Spring一起使用,我们来看一个简单的示例 。 以下是一项允许添加和检索产品的服务。 数据将使用内存中的HSQLDB数据库保留 。 我们将通过Java Persistence API(JPA)与数据库进行交互,并使用Hibernate对象关系映射(ORM)框架。 完整的代码可在https://github.com/afkham/msf4j-spring-sample/tree/master/获得 。
有一个具有main方法的应用程序类,该方法使用classpath中的spring.xml文件创建Spring上下文,如下所示。
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Application {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("classpath:/spring.xml");
}
}
这是上面使用的spring.xml文件,主要定义JPA实体管理器和事务管理器详细信息。
<!-- Scans the classpath for annotated components that will be auto-registered as Spring beans -->
<context:component-scan base-package="org.example.service, org.wso2.msf4j" />
<!-- Activates various annotations to be detected in bean classes e.g: @Autowired -->
<context:annotation-config />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem://productDb" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" p:packagesToScan="org.example.service" p:dataSource-ref="dataSource">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="showSql" value="true" />
</bean>
</property>
</bean>
<!-- Transactions -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="transactionManager" />
接下来,我们有名为ProductService的WSO2 MSF4J服务,该服务定义了两个操作。 除了JAX-RS资源注释外,还请注意@Component Spring注释。 我们还自动连接了ProductUtil和Util类。
@Component
@Path("/")
public class ProductService {
@Autowired
private ProductUtil productUtil;
@Autowired
private Util util;
@GET
@Path("/{id}")
public Response get(@PathParam("id") int id) {
util.print("Getting product with ID " + id);
Product product = productUtil.find(id);
return Response.status(Response.Status.OK).entity(product).build();
}
@POST
@Consumes("application/json")
public void add(@ApiParam(value = "Product object", required = true) Product product) {
productUtil.add(product);
util.print(productUtil.find(product.getId()).toString());
}
}
然后我们有一个POJO,代表一个产品 。 这是一个JPA实体以及一个对象,它映射到传入的HTTP JSON有效负载。
@Entity
public class Product {
@Id
private Integer id;
private String name;
public Product() {
}
public Product(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Product [id=" + id + ", name=" + name + "]";
}
}
我们还有一个名为Util的简单实用程序,用于将消息打印到System.out。 它自动连接到各自的WSO2 MSF4J服务和其他对象。
@Component
public class Util {
public void print(String msg) {
System.out.println(msg);
}
}
同样,我们有一个名为ProductUtil的AutoWired对象,该对象具有一些与产品相关的CRUD操作。
为了配置传输,我们有一个配置类。 在这里,我们将HTTP端口设置为9090。
@Configuration
public class TransportConfiguration {
@Bean
public HTTPTransportConfig http() {
return new HTTPTransportConfig(9090);
}
}
我们包括几个Exception Mappers ,它们将数据插入数据库或从数据库中检索到时可能发生的异常映射到正确的HTTP响应。 这些是使用@Component Spring注释连接的。
@Component
public class DataIntegrityViolationExceptionMapper implements ExceptionMapper<DataIntegrityViolationException> {
@Override
public Response toResponse(DataIntegrityViolationException e) {
return Response.status(Response.Status.CONFLICT).type("text/plain").entity("Data integrity violation").build();
}
}
@Component
public class NoResultExceptionMapper implements ExceptionMapper<NoResultException> {
@Override
public Response toResponse(NoResultException e) {
return Response.status(Response.Status.NOT_FOUND).type("text/plain").entity(e.getMessage()).build();
}
}
您可以从GitHub检出示例,然后使用Maven进行构建,执行Jar文件并使用cURL调用服务。 以下是运行示例,添加产品和检索产品的步骤:
- 运行服务:
java -jar target / msf4j-spring-example-0.0.1-SNAPSHOT.jar - 添加产品:
curl -v -X POST -H“ Content-Type:application / json” -d'{“ id”:1,“ name”:“ soap”}''http:// localhost:9090 / - 获取产品:curl -v http:// localhost:9090/1
结论
WSO2 MSF4J 2.0在支持Java微服务开发方面结合了两全其美的优势:Spring框架易于开发,WSO2 MSF4J的轻量级结构和快速的性能。 有兴趣探索能力可以在Github上访问WSO2 MSF4J开发者在这里和访问文档这里 。
wso2 esb部署 4.