Spring-Cloud-Eureka-Client 服务调用

之前说过了Eureka-Server的作用以及单机和集群的配置,这篇来说一说Eureka-Client与之间通过Feign来调用其他服务。

Netflix-Feign

Feign是受Retrofit,JAXRS-2.0和WebSocket启发的Java到HTTP客户端绑定程序。Feign的第一个目标是降低与DeSTfulness无关的将Denominator统一绑定到HTTP API的复杂性。

Feign使用Jersey和CXF之类的工具为ReST或SOAP服务编写Java客户端。此外,Feign允许您在诸如Apache HC之类的http库之上编写自己的代码。Feign通过可定制的解码器和错误处理功能,以最小的开销和代码将代码连接到http API,这些错误和错误处理可以写入任何基于文本的http API。

Feign如何工作?

Feign通过将注释处理为模板化请求来工作。在输出之前,参数以简单的方式应用于这些模板。尽管Feign仅限于支持基于文本的API,但它极大地简化了系统方面,例如重播请求。此外,Feign知道这一点后,就可以轻松对转换进行单元测试。

Eureka-Client

Eureka的发挥需要由Server、Client配合使用,Client会将自己注册到Server,由Server调度。接下来的案例会以服务注册中心服务提供者服务消费者这三个角色加上Feign的作用来发挥一点Eureka作用。

案例实践

本案例使用Spring-Cloud Hoxton.SR5 版本

服务提供者

首先引入需要的依赖

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

配置服务

spring:
  application:
    name: spring-cloud-producer
server:
  port: 9000
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka/

给启动类添加@EnableDiscoveryClient注解

@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudProducerApplication {

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

}

创建HelloController

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(String name, HttpServletRequest request) {
        int port = request.getServerPort();
        return "hello " + name + ", this is " + port + " first message";
    }
}

服务消费者

同样需要引入eureka-client依赖,除此之外还需要引入服务提供者没有的Feign的依赖。

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-openfeignartifactId>
dependency>

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

配置服务

spring:
  application:
    name: spring-cloud-consumer
server:
  port: 9001
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka/

启用Feign和Eureka-Client

@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class SpringCloudConsumerApplication {

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

}
  • @EnableFeignClients用来启用feign的远程调用

Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

创建HelloController、HelloService

Controller中注入远程调用服务,正常调用方法。

@RestController
public class HelloController {

    @Autowired
    HelloService helloService;

    @RequestMapping("/hello/{name}")
    public String hello(@PathVariable String name) {
        return helloService.hello(name) + this.hello;
    }
}

HelloService需要用@FeignClient注解声明这个接口中的方法是需要调用远程服务的

@FeignClient(name = "spring-cloud-producer")
public interface HelloService {

    @RequestMapping(value = "/hello")
    String hello(@RequestParam(value = "name") String name);
}
  • name属性与服务提供者的spring.application.name一致
  • 方法的调用地址、参数要与服务提供者中的一致

测试

单机调用

将eureka-server、服务提供者、服务消费者依次启动,这时访问Eureka-Server就会看到有两个可用服务:SPRING-CLOUD-PRODUCERSPRING-CLOUD-CONSUMER

访问http://localhost:9001/hello/eureka-feign,会收到hello eureka-feign, this is 9000 first message返回。

负载均衡

将服务提供者的端口改为9002,按上一篇里介绍的方法再次启动一个服务(#idea多实例启动),然后访问http://localhost:9001/hello/eureka-feign,经过多次访问就可以发现,hello eureka-feign, this is 9000 first messagehello eureka-feign, this is 9002 first message交替返回,这就是eureka为我们默认实现了负载均衡。

至此,关于Eureka的使用以及微服务中服务之间的调用已经说完了,接下来是Spring-Cloud中的熔断器Hystrix。

下一篇:Spring-Cloud Hystrix 服务熔断及仪表盘使用

文章参考

纯洁的微笑:springcloud(三):服务提供与调用

案例源码

运行源码的某一个服务时请将与本节不相关的功能注释掉,避免启动失败。

码云:spring-cloud-demo

你可能感兴趣的:(Spring,Cloud)