> 以HTTP接口形式的应用,是目前大部分中小型企业最常见的微服务夸语言交互的实现方式
>
> 即:定义多个接口,外部调用,经网关解析进行分发,小编遇到的这种情况是,有多个服务,每个服务都需要单独有网关开墙,很是头疼,每上线一个服务都需要网关配置,极其头疼,再次实现一种暴露一个接口,通过参数来实现调用不同的方法的案例
[GITHUB项目地址](https://github.com/lxchinesszz/Smile-GateWay-Api.git)
## 目录
### 思路分析
![流程图](http://note.youdao.com/yws/api/personal/file/WEB0e5b77dfa154d631dd892fa480032377?method=download&shareKey=cabda2685b8a79be3381cbedaf82f0ad)
实现方案:
- 1. 自定义注解 APiMapping
2. 自定义ApiGateWayServlet
3. 利用 Spring IOC 拆分方法并与 ApiMaping 做绑定由 ApiStore中HashMap维护
### 注解定义及利用IOC绑定注解与方法
api注解: `APIMapping`
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface APIMapping {
String value();
RequestMethod method();
}
```
通过注解对业务方法标记
```java
@APIMapping(value = "biz.api.order",method = RequestMethod.GET)
public OrderInfo getOrderInfo(String orderId) {
OrderInfo orderInfo = OrderInfo.builder().id(orderId).name("测试订单").price(12.2).build();
return orderInfo;
}
@APIMapping(value = "biz.api.order2",method = RequestMethod.POST)
public OrderInfo getOrderDo(OrderInfo orderInfo){
return orderInfo;
}
```
利用Spring 上下文对标记的方法进行绑定
初始化时候,扫描APIMapping接口
```
String[] names = applicationContext.getBeanDefinitionNames();
Class<?> type;
for (String name : names) {
type = applicationContext.getType(name);
for (Method method : type.getDeclaredMethods()) {
APIMapping apiMapping = method.getDeclaredAnnotation(APIMapping.class);
if (apiMapping!=null){
addApiItem(apiMapping,name,method);
}
}
}
```
重写自定义Servlet方法中的POST和GET
```
public class ApiGateWayServlet extends HttpServlet {
private ApplicationContext applicationContext;
private ApiGateWayHandler apiGateWayHandler;
@Override
public void init() throws ServletException {
super.init();
applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
apiGateWayHandler = applicationContext.getBean(ApiGateWayHandler.class);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
apiGateWayHandler.handle(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
apiGateWayHandler.handle(req,resp);
}
}
```
根据接口绑定获取到执行的方法,利用反射执行
```
public class ApiRunnable {
private String apiName;
private Method targetMethod;
private String targetName;
private Object target;
private String Method;
```
```
Object result = null;
Object target = apiRunable.getTarget();
Method targetMethod = apiRunable.getTargetMethod();
Set<Method> methods = ReflectionUtils.getMethods(target.getClass(), ReflectionUtils.withName(targetMethod.getName()));
Iterator<Method> iterator = methods.iterator();
Method method = null;
while (iterator.hasNext()) {
method = iterator.next();
}
Class<?>[] parameterTypes = method.getParameterTypes();
try {
Class<?> aClass = Class.forName(parameterTypes[0].getName());
Class<String> stringClass = String.class;
if (stringClass == aClass) {
result = apiRunable.run(parameter);
....
```
没有合适的资源?快使用搜索试试~ 我知道了~
基于springboot定义接口网关.zip
共85个文件
xml:69个
java:11个
yml:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 20 浏览量
2024-04-08
22:00:35
上传
评论
收藏 55KB ZIP 举报
温馨提示
可以用于毕业设计(项目源码+项目说明)目前在window10/11测试环境一切正常,用于演示的图片和部署教程说明都在压缩包里
资源推荐
资源详情
资源评论
收起资源包目录
基于springboot定义接口网关.zip (85个子文件)
Smile-GateWay-Api-master
pom.xml 3KB
src
main
resources
application.yml 21B
java
iflyer
gateway
modle
OrderInfo.java 309B
http
RequestMethod.java 380B
core
ApiStore.java 3KB
ApiGateWayServlet.java 1KB
ApiGateWayHandler.java 4KB
APIMapping.java 498B
service
OtoService.java 498B
impl
OtoServiceImpl.java 941B
SpringBootSampleApplication.java 1KB
util
SpringContextUtils.java 530B
JsonUtils.java 651B
.idea
libraries
Maven__org_springframework_boot_spring_boot_starter_logging_1_4_2_RELEASE.xml 736B
Maven__org_ow2_asm_asm_5_0_3.xml 460B
Maven__org_hibernate_hibernate_validator_5_2_4_Final.xml 622B
Maven__org_hamcrest_hamcrest_library_1_3.xml 541B
Maven__ch_qos_logback_logback_core_1_1_7.xml 535B
Maven__org_hamcrest_hamcrest_core_1_3.xml 520B
Maven__org_springframework_boot_spring_boot_autoconfigure_1_4_2_RELEASE.xml 722B
Maven__org_springframework_boot_spring_boot_starter_tomcat_1_4_2_RELEASE.xml 729B
Maven__org_springframework_boot_spring_boot_starter_web_1_4_2_RELEASE.xml 708B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_5_6.xml 641B
Maven__org_springframework_boot_spring_boot_test_1_4_2_RELEASE.xml 659B
Maven__org_springframework_spring_web_4_3_4_RELEASE.xml 597B
Maven__commons_collections_commons_collections_3_2_1.xml 604B
Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml 536B
Maven__org_springframework_boot_spring_boot_configuration_processor_1_4_2_RELEASE.xml 792B
Maven__org_springframework_spring_aop_4_3_4_RELEASE.xml 597B
Maven__org_springframework_boot_spring_boot_starter_aop_1_4_2_RELEASE.xml 708B
Maven__commons_logging_commons_logging_1_0_3.xml 560B
Maven__commons_httpclient_commons_httpclient_3_0_1.xml 593B
Maven__com_getsentry_raven_raven_8_0_2.xml 506B
Maven__com_fasterxml_classmate_1_3_3.xml 510B
Maven__org_springframework_boot_spring_boot_test_autoconfigure_1_4_2_RELEASE.xml 757B
Maven__junit_junit_4_12.xml 443B
Maven__org_slf4j_slf4j_api_1_7_21.xml 501B
Maven__commons_codec_commons_codec_1_10.xml 531B
Maven__org_springframework_boot_spring_boot_1_4_2_RELEASE.xml 624B
Maven__org_skyscreamer_jsonassert_1_3_0.xml 525B
Maven__org_projectlombok_lombok_1_16_6.xml 512B
Maven__org_springframework_boot_spring_boot_starter_test_1_4_2_RELEASE.xml 715B
Maven__org_yaml_snakeyaml_1_17.xml 483B
Maven__org_springframework_boot_spring_boot_starter_1_4_2_RELEASE.xml 680B
Maven__org_apache_tomcat_embed_tomcat_embed_core_8_5_6.xml 606B
Maven__org_springframework_spring_beans_4_3_4_RELEASE.xml 611B
Maven__org_apache_tomcat_embed_tomcat_embed_el_8_5_6.xml 592B
Maven__org_springframework_spring_core_4_3_4_RELEASE.xml 604B
Maven__org_reflections_reflections_0_9_10.xml 539B
Maven__com_fasterxml_jackson_core_jackson_core_2_8_4.xml 583B
Maven__org_aspectj_aspectjweaver_1_8_9.xml 530B
Maven__org_springframework_spring_context_4_3_4_RELEASE.xml 625B
Maven__org_objenesis_objenesis_2_1.xml 496B
Maven__com_getsentry_raven_raven_logback_8_0_2.xml 562B
Maven__org_slf4j_log4j_over_slf4j_1_7_21.xml 550B
Maven__org_springframework_spring_test_4_3_4_RELEASE.xml 604B
Maven__org_json_json_20140107.xml 476B
Maven__ch_qos_logback_logback_classic_1_1_7.xml 556B
Maven__org_assertj_assertj_core_2_5_0.xml 523B
Maven__net_minidev_json_smart_2_2_1.xml 509B
Maven__com_google_code_findbugs_annotations_2_0_1.xml 568B
Maven__org_javassist_javassist_3_20_0_GA.xml 538B
Maven__org_springframework_spring_webmvc_4_3_4_RELEASE.xml 618B
Maven__com_google_code_gson_gson_2_2_4.xml 503B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_4.xml 632B
Maven__org_mockito_mockito_core_1_10_19.xml 537B
Maven__net_minidev_accessors_smart_1_1.xml 530B
Maven__org_springframework_spring_expression_4_3_4_RELEASE.xml 646B
Maven__com_fasterxml_jackson_core_jackson_databind_2_8_4.xml 611B
Maven__org_jboss_logging_jboss_logging_3_3_0_Final.xml 596B
Maven__javax_validation_validation_api_1_1_0_Final.xml 599B
Maven__org_slf4j_jul_to_slf4j_1_7_21.xml 522B
Maven__com_jayway_jsonpath_json_path_2_2_0.xml 534B
Maven__com_google_guava_guava_15_0.xml 487B
workspace.xml 58KB
misc.xml 443B
inspectionProfiles
Project_Default.xml 262B
compiler.xml 659B
modules.xml 274B
preferred-vcs.xml 176B
encodings.xml 172B
target
classes
application.yml 21B
README.md 4KB
Smile-GateWay-Api.iml 7KB
项目授权码.txt 268B
共 85 条
- 1
资源评论
不走小道
- 粉丝: 3221
- 资源: 5113
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功