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

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

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

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

被剥离的api接口

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

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pers.cly</groupId>
<artifactId>demo-api</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging> <name>demo-api</name> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>

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

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

IUserService.java:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; @RequestMapping("/user")
public interface IUserService { @RequestMapping(value="/login",method=RequestMethod.POST)
String login(
@RequestParam("user_name")String user_name,
@RequestParam("user_psw")String user_psw);
}

服务提供方

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

    <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>pers.cly</groupId>
<artifactId>demo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>

项目的启动入口ProducerServerApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient
@SpringBootApplication
public class ProducerServerApplication { public static void main(String[] args) {
SpringApplication.run(ProducerServerApplication.class, args);
}
}

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

import org.springframework.web.bind.annotation.RestController;

import com.api.service.IUserService;

@RestController
public class ProducerController implements IUserService{ @Override
public String login(String user_name, String user_psw) {
return "用户名:"+user_name+",密码:"+user_psw;
}
}

服务调用方

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

    <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency> <dependency>
<groupId>pers.cly</groupId>
<artifactId>demo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>

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

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients; @EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerServerApplication.class, args);
}
}

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

IRefactorUserService.java

import org.springframework.cloud.netflix.feign.FeignClient;

import com.api.service.IUserService;

//定义FeignClient的名称,如果项目使用了Ribbon,value值会作为微服务的名称,用于服务发现
@FeignClient(value = "hello-service")
public interface IRefactorUserService extends IUserService{ }

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

ConsumerController.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import com.consumer.feign.inf.IRefactorUserService; @Controller
@RequestMapping(value = "/consumer")
public class ConsumerController {
@Autowired
IRefactorUserService iRefactorUserService; @RequestMapping(value="/feign-consumer",method=RequestMethod.GET)
@ResponseBody
public String hello() {
return iRefactorUserService.login("xiaoming", "12345");
}
}

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. Gitlab安装以及汉化

    Gitlab安装以及汉化 系统环境: CentOS 7.5 IP:192.168.1.2 关闭selinux.firewalld gitlab-ce-10.8.4 rpm包:下载地址 一.下载并安装g ...

  2. manjaro使用国内软件源

    虽然manjaro是基于arch修改的,但毕竟还是有些改动,如果可以用manjaro仓库里的,尽量不要用arch的源.如果嫌官方的软件源慢,可以直接一条命令修改成国内的软件源 sudo pacman- ...

  3. Bubble Sort (找规律)

    通过模拟之后我们发现对于每一个位置上的数他都有一个规律,那就是先左移然后在右移.然后仔细发现可以知道,先右移的距离是前面比该数大的个数.右移就直接右移到目标位置了.然后用一个树状数组从左到右边扫边加就 ...

  4. 使用shiro框架,注销问题的解决

    在使用shiro框架的时候,有时候会因为登录问题找不到注销的controller.所以会报404的错误,下面是解决办法: 1.首先写一个类SystemLogoutFilter继承LogoutFilte ...

  5. 给zabbix添加percona监控模板

    简单说明一下给zabbix添加的percona的监控模板. 在percona官方网站有说明怎么安装,这里记录下步骤.首先搭建好的zabbix环境. 监控插件连接 : 链接:https://pan.ba ...

  6. Git命令git update-index --assume-unchanged,忽略不想提交的文件(忽略跟踪)

    场景 我们在自己的私有测试分支上调试项目逻辑,给文件做了一些特定的修改,但是文件不想被git提交,不想执行git status命令时出现在modified列表里:再比如,我们本地的数据库和测试环境的数 ...

  7. Docker Swarm volume 数据持久化

    Docker Swarm volume 数据持久化 volume 是将宿主级的目录映射到容器中,以实现数据持久化. 可以用两种方式来实现: volume 默认模式:工作节点宿主机数据同步到容器内. v ...

  8. Python 进程间数据交互

    进程间通信:进程之间必须需要中间件. 不同进程间内存是不共享的,要想实现两个进程间的数据交换     Queues:实现传输两个进程的数据 线程queue,访问数据只能在一个进程内进行线程与线程之间的 ...

  9. 2018.9.22 NOIP模拟赛

    *注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...

  10. Android中intent的分类及使用

    intent分为隐式和显式,显式的浅显易懂就是直呼其名,可用intent类的一个构造函数,直接传入context和想要打开的活动的名称.还可以用setcomponent方法来确定要打开的活动的名称.而 ...