如何构建微服务是一个大话题,本节不会涉及细节,后面章节将会详细讲解。
在单体架构中,项目经常会打包成WAR文件部署在Tomcat或者Jetty等Servlet容器中。这种部署形式被称为基于Servlet的部署(Servlet-based Deployment)。这种部署环境也是使用最广泛的。
有时我们会有这样的需求,当Web应用不是很复杂,对应用性能要求不是很高时,需要将HTTP Server内嵌在我们的Java程序中,只要运行Java程序,相应的HTTP Server也就跟着启动了,而且启动速度很快。这就是本节所介绍的基于Java SE部署环境(Java SE Deployment)来提供REST微服务。
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容器不支持部署在除了根路径是(“/”)的上下文路径。非根路径的上下文路径在部署中是被忽略的。
构建一个实体类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项目下找到。
如果你觉得自己学习效率低,缺乏正确的指导,可以加入资源丰富,学习氛围浓厚的技术圈一起学习交流吧!
[Java架构群]
群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的JAVA交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
码字不易,如果觉得本篇文章对你有用的话,请给我一键三连!关注作者,后续会有更多的干货分享,请持续关注!