Spring Cloud之Eureka服务调用

Eureka注册中心搭建起来后,就会等待Eureka客户端注册和获取服务。那么就需要一个服务提供者和一个服务调用者,服务调用者从Eureka中获取到服务提供者的信息,然后调用相应的服务。

服务提供者

服务提供者,就是往Eureka注册中心注册服务,供服务调用者去调用。在上一篇文章的DEMO中,我们新建一个spring-cloud-provider模块。

pom.xml中增加Eureka Client的依赖:

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

application.yml配置文件中增加Eureka的配置:

spring:
  application:
    name: spring-cloud-provider

server:
  port: 8084

eureka:
  client:
    service-url:
      defaultZone: http://peer1:8081/eureka/,http://peer2:8082/eureka/,http://peer3:8083/eureka/

defaultZone里面把Eureka集群的全部地址填上,用逗号分隔,不要有空格。

提供一个服务,就是普通的SpringMVC的Controller:

@RestController
@RequestMapping("/user")
public class UserAction {

    @RequestMapping("/login")
    public String login(@RequestParam String name) {
        return "eureka".equals(name) ? "login success..." : "login failed...";
    }
}

启动类增加@EnableDiscoveryClient注解:

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

启动spring-cloud-provider项目。这时访问Eureka项目,就会发现spring-cloud-provider服务已经注册到Eureka集群中了。如图:
Eureka服务提供者

服务调用者

服务调用者本身和服务消费者并没有多大区别,都是把自己注册到Eureka中。至于如何调用,Spring Cloud提供了Feign组件。新建一个spring-cloud-consumer模块,

pom.xml中添加Eureka和feign的依赖:

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

application.yml配置文件:

spring:
  application:
    name: spring-cloud-consumer

server:
  port: 8085

eureka:
  client:
    service-url:
      defaultZone: http://peer1:8081/eureka/,http://peer2:8082/eureka/,http://peer3:8083/eureka/

feign的实现,用于远程调用:

@FeignClient(name= "spring-cloud-provider")
public interface UserService {

    @RequestMapping(value = "/user/login")
    String login(@RequestParam(value = "name") String name);
}
  • FeignClient的name:服务提供者的spring.application.name值,通过这个去找到具体服务

Feign有自己的调用地址格式,Spring Cloud为其增加了对SpringMVC注解的支持。另外,在这个Feign实现中,@RequestParam(value = "name")的value参数不能省略,否则会报错。

RequestMapping的value地址必须要和服务提供者的接口地址一致。

消费服务的Controller:

@RestController
public class UserAction {
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public String login(@RequestParam String name) {
        return userService.login(name);
    }
}

启动类:

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

相较于spring-cloud-provider项目的启动类,只是多了一个@EnableFeignClients注解

启动spring-cloud-consumer项目,访问http://localhost:8085/login?name=xxx,即可得到返回结果。如果name=eureka返回“login success…”,否则返回“login failed…”。

负载均衡

Spring Cloud在Feign中封装了Ribbon和Hystrix,所以FeignClient就具有了负载均衡和断路器的功能。

如果启动多个spring-cloud-provider项目,Feign调用时会自动进行负载均衡,无需额外配置。

先稍微修改一下服务实现:

@RestController
@RequestMapping("/user")
public class UserAction {
    @Value("${server.port}")
    private int port;

    @RequestMapping("/login")
    public String login(@RequestParam String name) {
        return port + ":" + ("eureka".equals(name) ? "login success..." : "login failed...");
    }
}

返回字符串增加一个端口号,方便知道调用的是哪个服务。

通过命令行启动两个spring-cloud-provider项目:

java -jar spring-cloud-provider.jar --server.port=8086
java -jar spring-cloud-provider.jar --server.port=8087

这时通过spring-cloud-consumer项目消费服务时,就会打印出端口号,即可验证FeignClient是可以进行负载均衡的。Ribbon默认是通过轮询的方式进行负载均衡的。

赞(0) 打赏
未经允许不得转载:当归笔记 » Spring Cloud之Eureka服务调用
分享到:

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用,就打赏一下作者吧~

支付宝扫一扫打赏

微信扫一扫打赏