今天看啥  ›  专栏  ›  傻姑不傻

分布式系统开发微服务架构,基于JavaSE部署环境提供REST微服务

傻姑不傻  · 简书  ·  · 2021-06-14 11:52

常用技术

如何构建微服务是一个大话题,本节不会涉及细节,后面章节将会详细讲解。

在单体架构中,项目经常会打包成WAR文件部署在Tomcat或者Jetty等Servlet容器中。这种部署形式被称为基于Servlet的部署(Servlet-based Deployment)。这种部署环境也是使用最广泛的。

有时我们会有这样的需求,当Web应用不是很复杂,对应用性能要求不是很高时,需要将HTTP Server内嵌在我们的Java程序中,只要运行Java程序,相应的HTTP Server也就跟着启动了,而且启动速度很快。这就是本节所介绍的基于Java SE部署环境(Java SE Deployment)来提供REST微服务。


Jetty HTTP Server

Jetty是流行的Servlet容器和HTTP服务器。在此我们不深究Jetty作为Servlet容器的能力(尽管在我们的测试和实例中都使用它),因为作为基于Servlet部署模型它并没有什么特别,我们在这里只重点描述如何使用Jetty的HTTP服务器。

Jersey和Jetty HTTP Server用法如下。

URI baseUri = UriBuilder.fromUri("http://localhost/").port(9998).build();
ResourceConfig config = new ResourceConfig(MyResource.class);
Server server = JettyHttpContainerFactory.createServer(baseUri, config);
要加入容器扩展模块依赖。
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-jetty-http</artifactId>
<version>2.30</version></dependency>

Jetty HTTP容器不支持部署在除了根路径是(“/”)的上下文路径。非根路径的上下文路径在部署中是被忽略的。

构建REST程序

构建一个实体类MyBean.java。

@XmlRootElement
public class MyBean {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

构建资源类MyResource.java,分别向外暴露各种类型资源,包括文本、XML、JSON格式。

@Path("myresource")
public class MyResource {
/**
* 方法处理HTTP GET请求。返回的对象以“text/plain”媒体类型给客户端
*
* @return String 以 text/plain 形式响应
*/
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
return "Got it!";
}
/**
* 方法处理HTTP GET请求。返回的对象以“application/xml”媒体类型给客户端
** @return MyPojo以application/xml形式响应
*/
@GET
@Path("pojoxml")
@Produces(MediaType.APPLICATION_XML)
public MyBean getPojoXml() {
MyBean pojo = new MyBean();
pojo.setName("waylau.com");
pojo.setAge(28);
return pojo;
}
/**
* 方法处理HTTP GET请求。返回的对象以“application/json”媒体类型给客户端
*
* @return MyPojo 以 application/json 形式响应
*/
@GET
@Path("pojojson")
@Produces(MediaType.APPLICATION_JSON)
public MyBean getPojoJson() {
MyBean pojo = new MyBean();
pojo.setName("waylau.com");
pojo.setAge(28);
return pojo;
}
}

程序的应用配置为RestApplication.java,该配置说明了要扫描的资源类所在的包路径com.waylau.rest.resource,以及支持JSON转换MultiPartFeature。

public class RestApplication extends ResourceConfig {
public RestApplication() {
// 资源类所在的包路径
packages("com.waylau.rest.resource");
// 注册MultiPart
register(MultiPartFeature.class);
}
}

主应用程序入口类App.java。

public class App {
// HTTP server所要监听的uri
public static final String BASE_URI = "http://127.0.0.1:8080/";
/**
* Main method.
*
* @param args* @throws IOException
*/
public static void main(String[] args) throws IOException {
JettyHttpContainerFactory.createServer(URI.create(BASE_URI),
new RestApplication());
}
}

运行

该程序编译后,会生成一个可执行的javase-rest-1.0.0.jar文件,用java -jar执行即可。

java -jar javase-rest-1.0.0.jar

该程序提供了如下API。

·http://127.0.0.1:8080/myresource。
·http://127.0.0.1:8080/myresource/pojoxml。
·http://127.0.0.1:8080/myresource/pojojson。

本节示例可以在javase-rest项目下找到。

写在最后

傻姑粉丝福利 :更多一线大厂面试题,高并发等主流技术资料尽在下方
github直达地址 一线大厂面试题,高并发等主流技术资料




原文地址:访问原文地址
快照地址: 访问文章快照