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. 54.超大数据快速导入MySQL

    超大数据快速导入MySQL  ----千万级数据只需几十分钟本地测试方法1.首先需要修改本地mysql的编码和路径,找到my.ini.2.在里面添加或修改 character-set-server=u ...

  2. Software Testing, Lab 1

    1.Install Junit(4.12), Hamcrest(1.3) with Eclipse 2.Install Eclemma with Eclipse 3.Write a java prog ...

  3. “==”和equals

    == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. 1.比较的是操作符两端的操作数是否是同一个对象.2.两 ...

  4. Docker bridge-utils 工具简单部署

    bridge-utils 网桥查看工具 # 1.安装 查看桥接工具 yum install -y bridge-utils # 2.查看桥接 命令brctl show bridge name brid ...

  5. 调用微信的扫一扫功能详解说明---(java 排坑版)

    最近碰到了这么一个需求,说是在前端页面调用手机本地的相机,扫描二维码这么一个需求,对于我一个后端来说, 这实在是难,难于上青天,但是决不能说一个不字.我说可以使用微信的扫码工具吗,这样可以方便一点,. ...

  6. FJUT3701 这也是一道数论题(线段树)题解

    Problem Description 好久没出数据结构题,现在赶紧来做道数据结构题热热身 小q现在要去银行,他有个很厉害的bug能看到前面排队的人.假如当前有人正在办理业务,那么肯定要等待前一个人完 ...

  7. C# 线程 正确使用Thread.Join()停止方式

    /// <summary>        /// 停下线程        /// </summary>        private void MyStopTask()     ...

  8. Docker常用命令详解

    docker ps 查看当前正在运行的容器 docker ps -a 查看所有容器的状态 docker start/stop id/name 启动/停止某个容器 docker attach id 进入 ...

  9. 编码原则 之 Explicit Dependencies Principle

    Explicit Dependencies Principle The Explicit Dependencies Principle states: Methods and classes shou ...

  10. Learning-Python【33】:并发编程之多进程

    一.multiprocessing 模块介绍 Python 中的多线程无法利用多核优势,如果想要充分地使用多核 CPU 的资源(os.cpu_count()查看),在 Python 中大部分情况需要使 ...