文档章节

SpringCloud 微服务 (七) 服务通信 Feign

___大侠
 ___大侠
发布于 06/22 12:19
字数 1038
阅读 18
收藏 5
点赞 0
评论 0

继续第(六)篇RestTemplate篇

做到现在,本机上已经有注册中心: eureka, 服务:client、order、product

继续在order中实现通信向product服务,使用Feign方式

下面记录学习和遇到的问题

 

order服务中, 开始需要在maven引入Feign的依赖,

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-feign</artifactId>
   <version>1.4.4.RELEASE</version>
</dependency>

注意 : 此处是遇到了这个问题 , 必须加上版本version , 不然jar引入不全 , 导致使用不了相关API,比如@EnableFeignClients注解不存在的问题,如果想尝试一下了解依赖问题的话,(这边是windows系统)可以CMD进入项目文件路径,比如本机项目的目录是E:/MyCloud/order , 然后执行mvn clean install -U命令,他会告诉你依赖问题,比如缺少版本号等等,

要是不知道某些依赖的全称或版本, 推荐上maven仓库查找,附上URL: http://mvnrepository.com/

还有feign改过名字,改成了openfeign,可以用以下代替依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

 

下面先在启动类上加上一个fegin的注解@EnableFeignClients ,如下

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {
   public static void main(String[] args) {
      SpringApplication.run(OrderApplication.class, args);
   }
}

 

接着请求目标服务product,相当于order是client,所以建一个ProductClient接口来完成任务

product服务

请求的接口还是上篇product中的简单接口,贴出来

@RestController
public class ProductsController {

    @GetMapping("/products")
    public String products(){
        return "hello,this is products";
    }
}

 

order服务中

接口ProductClient

@FeignClient("product")
public interface ProductClient {

    @GetMapping("/products")
    String getProduct();
}

以上@FeignClient(value="product"),product是注册中心product服务的Application名字,意思是这个client是访问product服务用的

Controller 使用该接口方式,比较方便,IDEA的@Autowired会爆红,不需要管他,没问题

@RestController
public class OrderController {

    @Autowired
    private ProductClient client;

    @GetMapping("/get")
    public String getProducts() {
        String str = client.getProduct();

        return str;
    }
}

以上就简单的实现了Feign通信

 

Feign: 声明式rest客户端 ,以上的操作没有动product服务中的代码,只在order服务中操作, 以接口加注解的方式实现

 

再贴一个例子 在order服务中依据product的id集合获取product列表: ↓↓↓

product服务

Controller层代码: 

@RestController
@RequestMapping("/product")
public class ProductController {

	@Autowired
    private ProductService productService;

	@PostMapping("/orderList")
	public List<Product> orderList(@RequestBody List<String> productIdList){
	    return productService.findByProductIdIn(productIdList);
	}
}

Service 接口:

public interface ProductService {
    List<Product> findByProductIdIn(List<String> productIdList);
}

Service 接口 实现:

@Service
public class ProductServiceImpl implements ProductService {
	@Autowired
    private ProductRepository repository;

    @Override
    public List<Product> findByProductIdIn(List<String> productIdList) {
        return repository.findByProductIdIn(productIdList);
    }
}

repository 接口 (JPA): 

public interface ProductRepository extends JpaRepository<Product,String> {
    List<Product> findByProductIdIn(List<String> productIdList);
}

product 对象:

@Entity
@Data
public class Product {
    @Id
    private String productId;
    private String productName;
    private BigDecimal productPrice;
    private String productPicture;
}

 

@FeignClient 接口块

@FeignClient("product")
public interface ProductClient {
    @PostMapping("/product/orderList")
    List<Product> getOrderList(@RequestBody List<String> productIdList);
}

order服务

Controller测试 :

@RestController
public class OrderController {

    @Autowired
    private ProductClient client;

    @GetMapping("/get")
    public String getProductList() {
    	List<String> productIdList=Arrays.asList("1","2");
        List<Product> productList = productClient.getOrderList(productIdList);

        return "123";
    }
}

两服务传递list类型参数的时候,需要Post请求,且@RequestBody注解转化

两边都设置了product对象,传与接

操作是比较简单的,只是一个普通的访问,但是呢,还是存在一些low的操作

现在此处有order,product两个服务,比如一个下订单的操作的时候,返回类型和传参是个什么方式呢,自然的微服务下不是你一个人开发的,此处两个服务是举例,假设两个接口不是一个组的开发,也可能是对外部使用的接口,我们自己封装了一个返回类型和传参,那么别人也要跟着创建一个类型DTO什么的,比较不合适,而且容易传递无用,不安全的信息给别人,还有像之前每个服务都引入maven依赖,比如lombok,web什么的重复了

 

分享学习项目多模块,可以减少maven多余的依赖,也可以分层实现服务,还是比较容易入手的

-----------------------------------------------------------

© 著作权归作者所有

共有 人打赏支持
___大侠
粉丝 24
博文 34
码字总数 36865
作品 0
杭州
程序员
SpringCloud之声明式服务调用 Feign(三)

一 Feign简介 Feign是一种声明式、模板化的HTTP客户端,也是netflix公司组件。使用feign可以在远程调用另外服务的API,如果调用本地API一样。 我们知道,阿里巴巴的doubbo采用二进制的RPC协议...

07/13
0
0
Spring Cloud-honghu Cloud分布式微服务云系统

简介 鸿鹄云Cloud是基于SpringCloud来封装的,是一系列框架的有序集合。利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现、注册、配置中心、消息总线、负载均衡、断路器...

itcloud
04/25
0
0
史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)

在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。...

方宏春
04/14
0
0
SpringCloud实战10-Sleuth

Spring-Cloud-Sleuth是Spring Cloud的组成部分之一,为SpringCloud应用实现了一种分布式追踪解决方案,其兼容了Zipkin, HTrace和log-based追踪,追踪微服务rest服务调用链路的问题,接触到zip...

狂小白
05/30
0
0
史上最简单的 SpringCloud 教程

《史上最简单的 SpringCloud 教程》系列: 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka) 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon) 史上最...

外星人et59
04/21
0
0
SpringCloud-Feign按照官方文档整还是报错404

看了半天书和官方文档也没找到错误的原因,请各位帮忙看看 使用的SpringCLoud版本是Dalstonsr1 使用的SpringBoot版本是1.5.9 报错内容: Eurka控制台截图 Eureka应该是没什么问题,因为在同一...

特拉仔
06/27
0
0
【Spring Cloud】分布式必学springcloud(七)——声明式服务调用Feign

一、前言 在上篇博客中,小编带大家接触了断路器Hystrix,是不是很好玩。分布式服务之间有了Hystrix,可以很好的提高容错性能。 但是在实际开发中,项目中会有很多的服务间的调用,对于服务的...

kisscatforever
04/23
0
0
【微服务】使用spring cloud搭建微服务框架,整理学习资料

写在前面   使用spring cloud搭建微服务框架,是我最近最主要的工作之一,一开始我使用bubbo加zookeeper制作了一个基于dubbo的微服务框架,然后被架构师否了,架构师曰:此物过时。随即,我...

grootzhang
06/27
0
0
【Spring Cloud】分布式必学springcloud(一)——简介和看法

一、前言 开篇之前,我想说,springcloud会完胜dubbo。 小编以前做分布式是用的webservice、dubbo。最近的项目中,开始使用了springcloud,springcloud包含了很多的组件,这些组件是dubbo没有...

kisscatforever
04/16
0
0
SpringCloud实战9-Stream消息驱动

官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架。   应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互,通过我们配置来 binding ,而 Spring Clo...

狂小白
05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
9分钟前
0
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
23分钟前
0
0
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
34分钟前
0
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
40分钟前
0
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
55分钟前
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
今天
0
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
今天
0
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
今天
0
0
安装tensorflow-XXX报错

报错: tensorflow-0.5.0-cp27-none-linux_x86_64.whl is not a supported wheel on this platform. 解决: wget https://bootstrap.pypa.io/get-pip.py sudo python2.7 get-pip.py sudo p......

Yao--靠自己
今天
0
0
JVM学习手册(一):JVM模型

一直从事JAVA开发,天天和JVM打交道,仔细想想对JVM还真的不是特别了解,实在是不应该.周六看了许多资料,也算有点心得,记录一下。 JVM内存模型分为5个区域:方法区,堆,虚拟机栈,本地方法栈,程序计...

勤奋的蚂蚁
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部