一, 环境准备
1, 下载一个简单的restful服务, 本文用了spring官网的demo, 传送门: https://spring.io/guides/gs/rest-service/
2, 上个章节用到的api-gateway项目, 传送门: 用Servlet写简单的ApiGateway (一)
3. 安装mysql, 并创建好所需的测试数据
二, 配置mybatis
具体步骤传送门: Mybatis组件在项目中的基础用法
三, 主程序
1, 项目文件结构
主程序文件App.java
package com.demo.apigateway;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import com.demo.data.RouteInfoDataAccess;
public class App extends HttpServlet {
private static final long serialVersionUID = 1L;
private HttpClient client;
private RouteInfoDataAccess routeData;
private String serviceHost="http://localhost:8090";
@Override
public void init() throws ServletException {
client = HttpClients.createDefault();
routeData = new RouteInfoDataAccess();
}
@Override
public void destroy() {
// 什么也不做
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String clientUrl =request.getRequestURI();
String serviceUrl = routeData.getRouteInfo(clientUrl);
if (serviceUrl == null) {
out.println(String.format("404: %s", clientUrl));
} else {
String url= mapUrl(serviceUrl);
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = client.execute(httpGet);
String content = readContent(httpResponse);
response.setContentType("application/json;charset=utf-8");
out.println(content);
}
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String clientUrl =request.getRequestURI();
String serviceUrl = routeData.getRouteInfo(clientUrl);
if (serviceUrl == null) {
out.println(String.format("404: %s", clientUrl));
}else {
String url= mapUrl(serviceUrl);
HttpPost httpPost = new HttpPost(url);
HttpEntity entity=new StringEntity(readContent(request));
httpPost.setEntity(entity);
HttpResponse httpResponse = client.execute(httpPost);
String content=readContent(httpResponse);
response.setContentType("application/json;charset=utf-8");
out.println(content);
}
}
@Override
public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
private String mapUrl(String clientUrl) {
return String.format("%s%s",serviceHost, clientUrl);
}
private String readContent(HttpResponse httpResponse) throws UnsupportedOperationException, IOException {
InputStream inStream = httpResponse.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "utf-8")); // utf-8 encoded
StringBuilder strber = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
strber.append(line);
inStream.close();
return strber.toString();
}
private String readContent(HttpServletRequest request) throws UnsupportedOperationException, IOException {
BufferedReader reader = request.getReader();
StringBuilder strber = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
strber.append(line);
return strber.toString();
}
}
为了简化代码, 我把公用部分封装成方法mapUrl, readContent
四, 启动服务
1, 用maven把restful的服务打包, 然后运行:
maven install打包成jar
打包出来的jar文件如下
用命令行进入该路径, 然后运行这个jar包:
启动成功后, 可以看得到这个服务在侦听8090端口:
2, 把api-gateway生成出来的classes文件夹放在tomcat的webapps目录下:
进入tomcat的安装目录, 启动脚本startup.bat
五, 测试效果
在浏览器输入 http://localhost:8080/api-gateway-demo/greeting
即可发现请求被转发到8090的服务端口上了
总结:
至此, 已经利用部署在tomcat的Servlet服务实现了api-gateway的功能, 通过database注册服务地址, 然后把来自于Client端的Http服务请求转发到对应的服务, 并且把请求回应给Client端.
下章预告: 用Servlet写简单的ApiGateway (三) -- 结合AOP实现权限控制