SpringCloud微服务之间的通讯,Feign和RestTemplate概念实例详解
前言:
- 在springcloud微服务的实际项目开发中,多个微服务之间不仅是相对独立的,而且也是相对关联的;也就是说,微服务之间需要相互访问,多个微服务之间的接口可能会被互相多次调用,我们称之为微服务之间的通信;
- 微服务之间的通信方式有很多,一般使用以下两种方法:一种是RestTemplate,另一种是Feign;
概念简介:
- RestTemplate,是spring中方便使用rest资源的一个对象,交互访问的资源通过URL进行识别和定位,每次调用都使用模板方法的设计模式,模板方法依赖于具体接口的调用,从而实现了资源的交互和调用; 它的交互方法有30多种,大多数都是基于HTTP的方法,比如:delete()、getForEntity()、getForObject()、put()、headForHeaders()等;
- Feign,一个声明式的伪HTTP客户端,使得编写HTTP客户端更加容易; 它只需要创建一个接口,并且使用注解的方式去配置,即可完成对服务提供方的接口绑定,大大简化了代码的开发量; 同时,它还具有可拔插的注解特性,而且支持feign自定义的注解和springMvc的注解(默认);
RestTemplate代码实践:
- 搭建eureka服务注册中心环境(这里不做描述,可自行搭建;
- 添加依赖;
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
- 在启动类Application添加负载均衡标识;
@LoadBalanced @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); }
- 服务提供类,服务名称:SERVICE1,端口:8082;
@RestController @RequestMapping("/service1") public class TestController { @RequestMapping(value = "test", method = {RequestMethod.POST,RequestMethod.GET}) public String test(@RequestParam(value = "testParam") String testParam) { System.println.out(testParam); return "success"; } }
- 服务消费类;
@RestController @RequestMapping("/serviceFront") public class ServiceFrontController { private final static String SERVICE1_URL = "http://SERVICE1:8082"; private final static String SERVICE1 = "SERVICE1"; @Autowired LoadBalancerClient loadBalancerClient; @Autowired RestTemplate restTemplate; @RequestMapping(value = "testFront", method = RequestMethod.POST) public HashMap<String,Object> testFront(@RequestParam String testParam) { this.loadBalancerClient.choose(SERVICE1);// 随机访问策略 String result = restTemplate.getForObject(SERVICE1_URL + "/service1/test?testParam={1}", String.class, testParam); HashMap<String,Object> map = new HashMap<String,Object>(); map.put("result", "测试结果!"+result); return map; } }
Feign代码实践:
- 搭建eureka服务注册中心环境(这里不做描述,可自行搭建);
- 添加依赖;
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
- 在启动类Application添加feign注解,声明启动feign客户端;
@EnableFeignClients
- 服务提供类,服务名称:SERVICE2,端口:8083;
@RestController @RequestMapping("/service2") public class TestController2 { @RequestMapping(value = "test2", method = {RequestMethod.POST,RequestMethod.GET}) public String test2(@RequestParam(value = "testParam2") String testParam2) { System.println.out(testParam2); return "success"; } }
- 服务消费接口类;
/** * 封装调用服务接口 */ @FeignClient(name = "SERVICE2") public interface TestFeignClient { //@RequestLine("GET /service2/test2") @RequestMapping(value="/service2/test2",method = RequestMethod.GET) public String test2(@RequestParam("testParam2") String testParam2); }
- 服务消费控制层;
@RestController @RefreshScope @RequestMapping("/serviceFront2") public class TestFeignController { @Autowired private TestFeignClient testFeignClient; @RequestMapping(value = "test2", method = { RequestMethod.POST }) public HashMap<String,Object> test2(@RequestParam String testParam2) { String result = testFeignClient.test2(testParam2); HashMap<String,Object> map = new HashMap<String,Object>(); map.put("result", "测试结果!"+result); return map; } }
总结:
微服务之间的通讯方式可以多种并存,各有优势,在项目实践中可具体情况具体分析,程序猿可以在开发系统的过程中,积累总结封装通讯的最佳方式,开发效率事半功倍~
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java 已老,Kotlin 或将取而代之?存在吗?
近期小编看到这样一篇文章 小编个人觉得Java不会衰落的 你们觉得呢? 把你们的想法在在下面评论席上发表出来 小编会一个一个看的 Java已经成为历史。它无法发展成现代语言,同时保证向后兼容性。但它为我们带来了最好的JVM生态系统,并引导了许多优秀语言的诞生,如Groovy、Scala、Clojure、Kotlin等。 ▌欢迎年纪最小的Kotlin! Kotlin诞生于2011年,但在去年Google宣布Kotlin成为安卓的官方开发语言之后迅速走红。Kotlin从其他JVM语言中借鉴了大量强大的功能。我们来快速浏览一下Kotlin能为Java开发者带来的好处。 无需再担心NPE Java程序员都讨厌运行时出现空指针异常(Null Pointer Exception,简称NPE)。Kotlin提供了最好的支持,从而在编译时避免空引用。默认情况下,所有对象都不能为空,如果想定义可空的类型,就必须使用 ? 操作符。访问可空的对象时,编译器会强行要求使用安全调用操作符 ?.。还可以用Elvis操作符 ?: 来赋默认值。 无需提供显式类型声明 Kotlin能够自动推断类型,因此无需显式声明...
- 下一篇
让程序员薪资上升一个level的良心十条建议,你有做到吗?
1. 想清楚,再动手写代码 刚入行的新手,不要因为展示自己的能力,拿到需求就迫切地就开始上手写代码,大忌! 2. 不交流,就会头破血流 团队之间最重要的就是沟通,不要因为自己不爱说话和沟通,造成需求理解错误的情况,最终苦的可是自己,只能加班返工了。 3. 文档没人看,但还是要写 不要以为自己写的文档没有看,其实文档的作用大部分时候不是用来沟通的,是用来做记录的,大部分需求还是通过口头沟通,但是不写文档做记录,后续就容易扯皮。 4. 一定要写注释 有时候记忆力真的是一个“bug”,想记起来的偏偏一点印象都没有,时间久了,你会连自己的代码都看不懂。 5. 别指望需求会稳定 工作时总会夹杂着各种变故,产品需求是根据商业需求不断调整的,改需求是再正常不过的事,别抱怨。 6. 业务高于技术 如果技术不为公司商业做服务,那将毫无价值,公司赚钱才是硬道理。 7. 不要心存侥幸 你隐约感觉会出bug的地方,就一定会出bug。有时候直觉就是那么可怕,觉得有问题时就在筛查一下。 8. 自己先测几遍 不要写完就扔给测试人员去测,经自己手的东西,要保证质量。 9. 尽可能自己解...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用