文档章节

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

_大侠__
 _大侠__
发布于 06/22 12:19
字数 1038
阅读 41
收藏 5

继续第(六)篇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多余的依赖,也可以分层实现服务,还是比较容易入手的

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

© 著作权归作者所有

共有 人打赏支持
_大侠__

_大侠__

粉丝 31
博文 57
码字总数 58737
作品 0
杭州
程序员
私信 提问
史上最简单的 SpringCloud 教程 | 终章

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/70148833 转载请标明出处...

方志朋
2017/04/12
0
0
迁移微服务框架-SpringCloud-事后总结

什么是微服务? 什么是 springcloud? 引用维基百科: 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微...

我是你大哥
09/10
0
0
外行人都能看懂的SpringCloud,错过了血亏!

只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)... 所以,这篇主要来讲讲SpringCloud的一些基础的知识。(我就是现学现...

Java3y
08/27
0
0
SpringCloud--鸿鹄Cloud分布式微服务云系统

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

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

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

itcloud
04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mybatis学习(1)

JDBC连接方式: 1.底层没有使用连接池,操作数据库需要频繁的创建和关闭连接,消耗资源。 2.写原生的JDBC代码在JAVA中,一旦需要修改SQL的话(比如表增加字段),JAVA需要整体重新编译,不利...

杨健-YJ
20分钟前
1
0
怎么组织文档

可以从以下几个方面考虑组织文档: ☐ 各种分支的界面截图和对应的类及文件 ☐ 框架或类图 ☐ 流程图 ☐ 时序图 ☐ 注意事项

-___-
32分钟前
1
0
分布式之数据库和缓存双写一致性方案解析

引言 为什么写这篇文章? 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。 但是在更新缓存方面,对于更...

别打我会飞
34分钟前
6
0
我的oracle11G,12c OCM之路

ocm认证感悟 ---------------------- 距离拿到ocm证书已经过了1年的时间,当初拿到证书的心情到现在还记得。其实在每个DBA心里都有一个成为强者的梦想,需要被认可,我也一样。我干过开发,做...

hnairdb
35分钟前
2
1
手动部署kubernetes集群(1.13.1最新版)

一、机器规划 使用五台机子部署k8s集群,规划如下: master节点3台(同时也是etcd节点) node节点2台 ip分配如下: ip:192.168.10.101,主机名:k8s-etcd01 ip:192.168.10.102,主机名:k8s...

人在艹木中
40分钟前
29
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部