SpringCloud的服务间通信主要有两种办法,一种是使用Spring自带的RestTemplate,另一种是使用Feign,这里主要介绍后者的通信方式。

整个实例一共用到了四个项目,一个Eureka注册中心,一个服务调用组件、一个服务提供组件、独立的api接口项目。

eureka注册中心这里就不多说了,具体的配方式没有什么变化。

Feign的接口申明方式有很多种,这里使用了Feign的“继承特性”,将对外接口从控制器中剥离了出来,配合maven仓库实现接口共享。

被剥离的api接口

创建一个独立的maven项目,这个项目里面装的都是各个服务的对外接口。

pom.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>pers.cly</groupId>
  6. <artifactId>demo-api</artifactId>
  7. <version>1.0.0</version>
  8. <packaging>jar</packaging>
  9.  
  10. <name>demo-api</name>
  11.  
  12. <parent>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-parent</artifactId>
  15. <version>1.5.3.RELEASE</version>
  16. <relativePath/> <!-- lookup parent from repository -->
  17. </parent>
  18.  
  19. <properties>
  20. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  21. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  22. <java.version>1.8</java.version>
  23. </properties>
  24.  
  25. <dependencies>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-web</artifactId>
  29. </dependency>
  30. </dependencies>
  31. </project>

注意此处的<groupid>、<artifactid>、<version>三个标签,这三个标签共同构成了每个项目的唯一标识,后面需要通过这三个标签将该项目引入其他maven项目中。

下面这个是我这次创建的实例接口,对外提供的是一个login方法,相当于是user控制器。

IUserService.java:

  1. import org.springframework.web.bind.annotation.RequestMapping;
  2. import org.springframework.web.bind.annotation.RequestMethod;
  3. import org.springframework.web.bind.annotation.RequestParam;
  4.  
  5. @RequestMapping("/user")
  6. public interface IUserService {
  7.  
  8. @RequestMapping(value="/login",method=RequestMethod.POST)
  9. String login(
  10. @RequestParam("user_name")String user_name,
  11. @RequestParam("user_psw")String user_psw);
  12. }

服务提供方

pom.xml中需要引入以下三个依赖,需要注意的是下面第三个依赖是刚刚我们创建的接口项目的依赖标识。

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-eureka</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>pers.cly</groupId>
  12. <artifactId>demo-api</artifactId>
  13. <version>1.0.0</version>
  14. </dependency>
  15. </dependencies>

项目的启动入口ProducerServerApplication.java

  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  4.  
  5. @EnableDiscoveryClient
  6. @SpringBootApplication
  7. public class ProducerServerApplication {
  8.  
  9. public static void main(String[] args) {
  10. SpringApplication.run(ProducerServerApplication.class, args);
  11. }
  12. }

控制器。控制器需要实现自己对应的api接口,我们之所以引入api接口项目依赖也是为了这个。

  1. import org.springframework.web.bind.annotation.RestController;
  2.  
  3. import com.api.service.IUserService;
  4.  
  5. @RestController
  6. public class ProducerController implements IUserService{
  7.  
  8. @Override
  9. public String login(String user_name, String user_psw) {
  10. return "用户名:"+user_name+",密码:"+user_psw;
  11. }
  12. }

服务调用方

pom.xml,与服务提供方一样,调用方也得引入自建的api依赖。

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-eureka-server</artifactId>
  9. </dependency>
  10.  
  11. <dependency>
  12. <groupId>org.springframework.cloud</groupId>
  13. <artifactId>spring-cloud-starter-feign</artifactId>
  14. </dependency>
  15.  
  16. <dependency>
  17. <groupId>pers.cly</groupId>
  18. <artifactId>demo-api</artifactId>
  19. <version>1.0.0</version>
  20. </dependency>
  21. </dependencies>

服务启动入口ConsumerServerApplication.java,要加@EnableFeignClients注解

  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  4. import org.springframework.cloud.netflix.feign.EnableFeignClients;
  5.  
  6. @EnableFeignClients
  7. @EnableDiscoveryClient
  8. @SpringBootApplication
  9. public class ConsumerServerApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(ConsumerServerApplication.class, args);
  12. }
  13. }

在本地创建一个接口继承被剥离的api接口,之后我们操作的都是这个自建接口。此处这个自建接口里不需再创建什么新方法了。

IRefactorUserService.java

  1. import org.springframework.cloud.netflix.feign.FeignClient;
  2.  
  3. import com.api.service.IUserService;
  4.  
  5. //定义FeignClient的名称,如果项目使用了Ribbon,value值会作为微服务的名称,用于服务发现
  6. @FeignClient(value = "hello-service")
  7. public interface IRefactorUserService extends IUserService{
  8.  
  9. }

控制器中可以通过之前的自建接口使用相应的其他组件提供的服务

ConsumerController.java

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. import org.springframework.web.bind.annotation.ResponseBody;
  6.  
  7. import com.consumer.feign.inf.IRefactorUserService;
  8.  
  9. @Controller
  10. @RequestMapping(value = "/consumer")
  11. public class ConsumerController {
  12. @Autowired
  13. IRefactorUserService iRefactorUserService;
  14.  
  15. @RequestMapping(value="/feign-consumer",method=RequestMethod.GET)
  16. @ResponseBody
  17. public String hello() {
  18. return iRefactorUserService.login("xiaoming", "12345");
  19. }
  20. }

SpringCloud使用Feign实现服务间通信的更多相关文章

  1. Spring Cloud netflix feign【服务间通信】

    一.简介 1,进程间通讯的本质是交换消息 2,服务间通信的两种方式 (1)RESTFul风格 (2)RPC风格 (3)两种风格的比较 3.基于RESTFul风格服务调用模型 4.基于Spring Cl ...

  2. 007. 服务间通信 RPC & REST over HTTP(s) & 消息队列

    服务间通信 服务间通信的几种方式: RPC.REST over HTTP(s).消息队列.  https://www.jianshu.com/p/2a01d4383d0b RPC https://bl ...

  3. 浅谈服务间通信【MQ在分布式系统中的使用场景】

    解决的问题 一项技术的产生必然是为了解决问题而生,了解了一项技术解决的问题,就能够很轻松的理解这项技术的设计根本,从而更好地理解与使用这项技术. 消息中间件和RPC从根本上来说都是为了解决分布式系统的 ...

  4. eShopOnContainers 知多少[11]:服务间通信之gRPC

    引言 最近翻看最新3.0 eShopOncontainers源码,发现其在架构选型中补充了 gRPC 进行服务间通信.那就索性也写一篇,作为系列的补充. gRPC 老规矩,先来理一下gRPC的基本概念 ...

  5. gRPC-微服务间通信实践

    微服务间通信常见的两种方式 由于微服务架构慢慢被更多人使用后,迎面而来的问题是如何做好微服务间通信的方案.我们先分析下目前最常用的两种服务间通信方案. gRPC(rpc远程调用) 场景:A服务主动发起 ...

  6. CAP-微服务间通信实践

    微服务间通信常见的两种方式 由于微服务架构慢慢被更多人使用后,迎面而来的问题是如何做好微服务间通信的方案.我们先分析下目前最常用的两种服务间通信方案. gRPC(rpc远程调用) gRPC-微服务间通 ...

  7. .NET Core使用gRPC打造服务间通信基础设施

    一.什么是RPC rpc(远程过程调用)是一个古老而新颖的名词,他几乎与http协议同时或更早诞生,也是互联网数据传输过程中非常重要的传输机制. 利用这种传输机制,不同进程(或服务)间像调用本地进程中 ...

  8. 使用gRPC打造服务间通信基础设施

    一.什么是RPC rpc(远程过程调用)是一个古老而新颖的名词,他几乎与http协议同时或更早诞生,也是互联网数据传输过程中非常重要的传输机制. 利用这种传输机制,不同进程(或服务)间像调用本地进程中 ...

  9. SpringCloud 使用Feign访问服务

    Feign简介: 声明式的Rest  WEB 服务的客户端, https://github.com/OpenFeign/feign.Spring Cloud 提供了Spring-cloud-start ...

随机推荐

  1. Thinkphp----------Thinkphp3.2的目录结构介绍

    ThinkPHP框架目录结构\index.php      入口文件\Application    应用目录\Public            资源文件目录\ThinkPHP      框架核心目录 ...

  2. pascal中的xor,shr,shl,Int(),ArcTan(),copy,delete,pos和leftstr,RightStr等详解

    数学函数:Inc(i)使I:=I+1;Inc(I,b)使I:=I+b;Abs(x)求x的绝对值例:abs(-3)=3Chr(x)求编号x对应的字符. 例:Chr(65)=’A’chr(97)=’a’c ...

  3. (TIP 2018)Technology details of FFDNet

    前言 论文地址:见researchgate, 方法继续更新. 解决的问题: 1.discriminative learning methods 用于denoising 任务学习到的是一个对于每种 噪声 ...

  4. redis工具

    pom.xml添加 <!--jedis redis客户端--> <dependency> <groupId>redis.clients</groupId> ...

  5. oracle查询buffer cache中undo大小

    1.Does undo buffer exists or changes will directly write to undo datafiles? Undo blocks are database ...

  6. RESTful API 设计指南-阮一峰

    作者: 阮一峰 日期: 2014年5月22日 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制 ...

  7. dataguard从库数据库丢失恢复例子(模拟所有的控制文件)

    1.退出日志应用模式[oracle@localhost ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Production on Mon Jan 14 ...

  8. Always clear download 下载 谷歌浏览器插件

    由于该博文不支持上传压缩包,因此,如有需要always clear download插件的可点击此链接在百度网盘上下载https://pan.baidu.com/s/13wWchis3iKqXkIA5 ...

  9. 【2.0】SpringBoot2配置Druid数据源及监控

    什么是Druid? Druid首先是Java语言中最好的数据库连接池,也是阿里巴巴的开源项目.Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池, ...

  10. sqlserver 判断字符串是否是数字

    https://www.cnblogs.com/zjfblog/p/5625202.html sql2005有个函数ISNUMERIC(expression)函数:当expression为数字时,返回 ...