1 使用方法

1.1 Provider

使用示例如下:

@RestSchema(schemaId = "springmvcHello")
@RequestMapping(path = "/springmvchello", produces = MediaType.APPLICATION_JSON)
public class SpringmvcHelloEndpoint implements Hello {@Override@RequestMapping(path = "/sayhi", method = RequestMethod.POST)public String sayHi(@RequestParam(name = "name", defaultValue = "test") String name) {return "Hello " + name;}@Override@RequestMapping(path = "/sayhello", method = RequestMethod.POST)public String sayHello(@RequestBody Person person) {return "Hello person " + person.getName();}
}public interface Hello {String sayHi(String name);String sayHello(Person person);
}

microservice.yml配置如下:

servicecomb:service:application: springmvc-samplename: springmvcversion: 0.0.1registry:# Default using local service centeraddress: http://localhost:30100# address: https://cse.cn-south-1.myhuaweicloud.cominstance:watch: falseconfig:client:# Default using local config center# serverUri: https://cse.cn-south-1.myhuaweicloud.comserverUri: http://localhost:30113refreshMode: 1

1.2 Consumer

使用示例如下:

@Component("SpringmvcHelloClient")
public class SpringmvcHelloClient {private static final Logger LOG = LoggerFactory.getLogger(SpringmvcHelloClient.class);private static RestTemplate restTemplate = RestTemplateBuilder.create();@RpcReference(microserviceName = "springmvc", schemaId = "springmvcHello")private static Hello hello;public void run() throws Exception {Person person = new Person();person.setName("ServiceComb/Java Chassis");// RestTemplate Consumer or POJO Consumer. You can choose whatever you like// 1 RestTemplate ConsumerString sayHiResult =restTemplate.postForObject("cse://springmvc/springmvchello/sayhi?name={name}", null, String.class, "Java Chassis");Assertion.assertEquals("Hello Java Chassis", sayHiResult);String sayHiDefaultResult =restTemplate.postForObject("cse://springmvc/springmvchello/sayhi", null, String.class);Assertion.assertEquals("Hello test", sayHiDefaultResult);String sayHelloResult = restTemplate.postForObject("cse://springmvc/springmvchello/sayhello", person, String.class);Assertion.assertEquals("Hello person ServiceComb/Java Chassis", sayHelloResult);System.out.println("RestTemplate Consumer or POJO Consumer.  You can choose whatever you like.");System.out.println("RestTemplate consumer sayhi services: " + sayHiResult);System.out.println("RestTemplate consumer sayHiDefault services: " + sayHiDefaultResult);System.out.println("RestTemplate consumer sayhello services: " + sayHelloResult);// 2 POJO ConsumerString pojoSayHi = hello.sayHi("Java Chassis");Assertion.assertEquals("Hello Java Chassis", pojoSayHi);String pojoSayHello = hello.sayHello(person);Assertion.assertEquals("Hello person ServiceComb/Java Chassis", pojoSayHello);System.out.println("POJO consumer sayhi services: " + pojoSayHi);System.out.println("POJO consumer sayhello services: " + pojoSayHello);// 3 AsyncRestTemplate Consumer// NOTICE: since 2.0.0, spring deprecated AsyncRestTemplate, user's can use CompletableFuture of RPC insteadCseAsyncRestTemplate cseAsyncRestTemplate = new CseAsyncRestTemplate();ListenableFuture<ResponseEntity<String>> responseEntityListenableFuture = cseAsyncRestTemplate.postForEntity("cse://springmvc/springmvchello/sayhi?name={name}", null, String.class, "Java Chassis");ResponseEntity<String> responseEntity = responseEntityListenableFuture.get();Assertion.assertEquals("Hello Java Chassis", responseEntity.getBody());System.out.println("AsyncRestTemplate Consumer sayHi services: " + responseEntity.getBody());HttpEntity<Person> entity = new HttpEntity<>(person);ListenableFuture<ResponseEntity<String>> listenableFuture = cseAsyncRestTemplate.exchange("cse://springmvc/springmvchello/sayhello", HttpMethod.POST, entity, String.class);listenableFuture.addCallback(new ListenableFutureCallback<ResponseEntity<String>>() {@Overridepublic void onFailure(Throwable ex) {LOG.error("AsyncResTemplate Consumer catched exception when sayHello, ", ex);}@Overridepublic void onSuccess(ResponseEntity<String> result) {System.out.println("AsyncRestTemplate Consumer sayHello services: " + result.getBody());}});}
}

cse展示了三种调用provider的方式,第二种方式,使用RPC的方式调用provider,本质都是发送http请求,consumer的实现逻辑不做进一步探讨。

2 初始化

Provider

provider中重要的注解是RestSchema,RestSchema注解扫描在RestProducers类中,实现如下:

@Component
public class RestProducers implements BeanPostProcessor {private List<ProducerMeta> producerMetaList = new ArrayList<>();// 1 @SuppressWarnings("unchecked")private Class<? extends Annotation> restControllerCls = (Class<? extends Annotation>) ReflectUtils.getClassByName("org.springframework.web.bind.annotation.RestController");private boolean scanRestController = restControllerCls != null &&DynamicPropertyFactory.getInstance().getBooleanProperty(RestConst.PROVIDER_SCAN_REST_CONTROLLER, true).get();public List<ProducerMeta> getProducerMetaList() {return producerMetaList;}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {processProvider(beanName, bean);return bean;}protected void processProvider(String beanName, Object bean) {// aop后,新的实例的父类可能是原class,也可能只是个proxy,父类不是原class// 所以,需要先取出原class,再取标注Class<?> beanCls = BeanUtils.getImplClassFromBean(bean);if (beanCls == null) {return;}RestSchema restSchema = beanCls.getAnnotation(RestSchema.class);if (restSchema != null) {ProducerMeta producerMeta = new ProducerMeta(restSchema.schemaId(), bean);producerMeta.setSchemaInterface(restSchema.schemaInterface());producerMetaList.add(producerMeta);return;}if (scanRestController && beanCls.getAnnotation(restControllerCls) != null) {ProducerMeta producerMeta = new ProducerMeta(beanCls.getName(), bean);producerMetaList.add(producerMeta);}}
}

在cse的实现中,首先扫描RestSchema注解,如果没有使用RestSchema注解,则扫描RestController注解,RestController注解生成的接口契约默认使用bean的名称作为schemaId,其实这就与Rpc的使用方式差别不大了。

3 调用方式

参见rpc调用方式。

CSE REST源码分析相关推荐

  1. HTTP服务器的本质:tinyhttpd源码分析及拓展

    已经有一个月没有更新博客了,一方面是因为平时太忙了,另一方面是想积攒一些干货进行分享.最近主要是做了一些开源项目的源码分析工作,有c项目也有python项目,想提升一下内功,今天分享一下tinyhtt ...

  2. DDPush开源推送框架源码分析之APPServer到DDPush

    DDPush 任意门推送 DDPush是什么 DDPush (Dimension Door Push),任意门推送,是一款开源免费的单机千万级实时信息推送服务器,使用Java语言开发,具有简单.稳定. ...

  3. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  4. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  5. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  6. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  7. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

  8. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  9. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

最新文章

  1. 年中盘点:2021年炙手可热的10家数据科学和机器学习初创公司
  2. WideCharToMultiByte和MultiByteToWideChar函数的用法(转)
  3. AT1983-[AGC001E]BBQ Hard【dp,组合数学】
  4. c 语言 结构体 编程,C语言:结构体的编程问题(很简单)
  5. cmake编译cocos2d-x报错
  6. 直方图均衡化计算过程步骤
  7. myeclipse9.1 安装svn(图)
  8. 目前常用的开源服务器端技术
  9. 蓝桥杯ALGO-147算法训练 4-3水仙花数
  10. Maven项目环境搭建实例.
  11. 问题六十:怎么用ray tracing画回旋体(rotational sweeping / revolution)
  12. MATLAB2010激活后无法打开MATLAB的解决方法
  13. jsp里照片放在哪里_2020年初级会计报名照片怎么上传?
  14. 【备考初赛】1.1 计算机常识
  15. Java *1.11(人口估算)美国人口调查局基于以下假设进行人口估算:
  16. 微信小程序iOS系统上echarts不能滑动的问题
  17. PHY--PDSCH
  18. rrpp协议如何修改_RRPP单环
  19. 北大直博保送生论文涉嫌抄袭?原作者实名举报,北大南开火速调查
  20. c语言递归求和函数,c语言递归算法怎么实现

热门文章

  1. 利用Python识别txt文本并根据其内容进行文件分类
  2. Arduino下使用ESP8266和ST7735屏显示图片
  3. STM32CubeMX配置STM32使用看门狗
  4. BUUCTF:后门查杀
  5. 2012-11-06
  6. js用类的方法写萤火虫和组合创建的方法写萤火虫
  7. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 K-Dimensional Foil II(思维题)
  8. 办公软件之excel打印时打印区域与纸张不符解决方法
  9. java facets_按ggplot(facets)中的因子绘制的多个图
  10. 心目中的理想工作排行榜