Feign环境搭配与知识点记录
一、微服务协作流程
1、在微服务启动时,会向服务发现中心上报自身实例信息,包括:IP地址、端口号信息。
2、微服务会定期从(服务发现中心)获取服务实例列表。
3、当“服务A”调用“服务B”时,ribbon组件从本地服务实例列表中查找“服务B“的实例,如获取了多个实例,这时ribbon会通过用户所配置的负载均衡策略从中选择一个实例。
4、最终,Feign组件会通过ribbon选取的实例发送http请求。
二、在"A服务"中通过Feign调用"B服务"步骤:
前提:A服务和B服务都在注册中心注册
1、“B服务”中Controller方法
@RequestMapping("/member/list") public R membercoupons(){ CouponEntity couponEntity = new CouponEntity(); couponEntity.setCouponName("满100减10"); return R.ok().put("coupons",Arrays.asList(couponEntity)); }
2、在A服务中引入依赖,版本号由父工程声明
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
feign里面有ribbon依赖
3、在A服务中接口上标注@FeignClient("serviceB"),表明此接口中的方法是调用注册中心中名为“serviceB”的服务
package com.syf.gulimall.member.feign; @FeignClient("serviceB") public interface CouponFeignService { //请求B服务 @RequestMapping("coupon/coupon/member/list") public R membercoupons(); }
4、在A服务中spring boot 启动类中标注@EnableFeignClients,表明此项目开启Feign客户端
@EnableFeignClients(basePackages = "com.syf.gulimall.member.feign") @SpringBootApplication @EnableDiscoveryClient public class GulimallMemberApplication { public static void main(String[] args) { SpringApplication.run(GulimallMemberApplication.class, args); } }
5、在A服务中 controller层 请求A服务 "/coupons"路径,A服务会调用B服务
@Autowired CouponFeignService couponFeignService; @RequestMapping("/coupons") public R test(){ R membercoupons = couponFeignService.membercoupons(); System.out.println(membercoupons); return null; }
Feign的工作步骤
1、在声明Feign客户端之后,Feign会根据@FeignClient注解使用java的动态代理技术生成代理类,在这里我们指定@FeignClient value为serviceB,则说明这个类的远程目标为spring cloud的服务名称为serviceB的微服务。
2、serviceB的具体访问地址,Feign会交由ribbon获取,若该服务有多个实例地址,ribbon会采用指定的负载均衡策略选取实例。
3、Feign兼容spring的web注解(如:@GetMapping),它会分析声明Feign客户端方法中的Spring注解,得出Http请求method、参数信息以及返回信息结构。
4、当业务调用Feign客户端方法时,会调用代理类,根据以上分析结果,由代理类完成实际的参数封装、远程http请求,返回结果封装等操作。