用Servlet写简单的ApiGateway (二) --结合mybatis实现服务的注册和请求转发

 

一, 环境准备

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实现权限控制

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值