微服务之二:Feign(2)

一: 在spring cloud 中使用Feign

Feign 采用的是基于接口的注解
Feign 整合了ribbon,具有负载均衡的能力
整合了Hystrix,具有熔断的能力

Spring cloud中对Feign进行了封装,测试案例三个

  • spring -feign-server:Eureka服务器项目,8761
  • spring-feign-provider:服务提供者,需要将服务注册到8761上,提供两个端口号8080、8081
    • “/person/{personId}”
    • “/hello”服务
  • spring-feign-invoker:服务调用者,9000.。调用上面的服务

1.1 服务调用者(spring-feign-invoker)

1.1.1 添加依赖项(invoker项目)

<!-- SpringCloud 整合 Feign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

1.1.2 启动类添加feign(invoker项目)

利用@EnableFeignClients//调用者启动时,打开Feign开关

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients//调用者启动时,打开Feign开关
public class MySpringFeignInvoker {

    public static void main(String[] args) {
        SpringApplication.run(MySpringFeignInvoker.class, args);
    }
}

1.1.3 编写客户端接口(invoker项目)

/**
 * 客户端服务接口
 * 
 * 与单独使用Feign不同:
 * 1.接口需要使用@FeignClient注解修饰
 * 2.声明需要调用的服务名称
 */
@FeignClient("atm-spring-feign-provider")
public interface PersonClient {

    /**
     * 之前得知:
     * 通过编写"翻译器"(Contract),可以让Feign知道第三方注解的含义
     * 同样,SpringCloud也提供了翻译器,会将注解告诉Feign
     * 因此,接口可以直接使用该注解
     * 默认支持注解:@RequestMapping、@RequestParam、@RequestParam、@PathVariable
     * 【注意】使用了SpringCloud的翻译器后,将不能再使用Feign的默认注解
     */
    @GetMapping("/hello")
    //@RequestMapping(method=RequestMethod.GET,value="/hello")
    String sayHello();


    @RequestMapping(method=RequestMethod.GET,value="/hello/{name}")
    String hello(@PathVariable("name") String name);
}

与单独使用Feign不同之处:

  • 使用@FeignClient注解,指定访问的服务端(服务提供者spring -feign-provider
  • 使用第三方注解,spring cloud的内置“翻译器”(Contract)翻译成Feign能理解的含义
    * @RequestMapping
    * @PathVariable
    * @RequestParam
    * @RequestParam

1.1.4 控制器测试类(invoker项目)


@RestController
@Configuration
public class MyInvokerController {

    //在控制器中调用接口方法   ---start

    @Autowired
    private PersonClient personClient;

    @RequestMapping(value="/invokeHello",method=RequestMethod.GET)
    public String invokeHello(){
        return personClient.sayHello();
    }

    //在控制器中调用接口方法   ---end
}
  • 启动spring_feign_server(8761端口)
  • 启动spring_feign_provider(8080端口、8081端口)
  • 启动spring_feign_invoker(9000端口)
    浏览器访问http://localhost:9000/invokerHello可以发现:服务提供者的“/hello”被调用

按顺序依次启动三个项目,在浏览器中输入:http://localhost:9000/invokerHello,可以看到服务被调用。

1.2 Feign负载均衡

  • spring cloud实现的Feign客户端,类名为LoadBalanceFeignClient,
  • 在该类中,维护着与SpringClientFactoey相关的实例,通过SpringClientFactory可以获得负载均衡器
    • Feign 采用的是基于接口的注解
    • Feign 整合了ribbon,具有负载均衡的能力
    • 整合了Hystrix,具有熔断的能力

项目背景:

  • 一个Eureka服务端
  • 两个服务提供者,名称一致(spring-feign-provider)
    * 端口号不一致 8080/8011
  • 一个服务调用者,spring -feign-invoker

1.2.1 服务调用端接口

/**
 * 客户端服务接口
 * 
 * 与单独使用Feign不同:
 * 1.接口需要使用@FeignClient注解修饰
 * 2.声明需要调用的服务名称
 */
@FeignClient("spring-feign-provider")
public interface PersonClient {

    @RequestMapping(method = RequestMethod.GET, value = "/person/{personId}")
    Person getPerson(@PathVariable("personId") Integer personId);

}

1.2.2 控制端测试

@RestController
@Configuration
public class MyInvokerController {

    @RequestMapping(value = "/router", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public String router() {
        // 调用服务提供者的接口
        Person p = personClient.getPerson(2);
        return p.getName();
    }
}

运行的结果,将循环访问8080和8081,实现负载均衡的功能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值