搭建Spring Cloud Eureka服务注册中心(二)服务调用

上一节我们搭建了单节点的Eureka和一个provide-server的服务,这一次我们再新创建一个consume-server,然后使用RestTemplate实现服务之间的调用。

1、创建consume-server服务

服务创建过程就不一一描述了,这里贴一下application.yml

server:
  port: 40001
spring:
  application:
    name: CONSUME-SERVER
eureka:
  instance:
    appname: CONSUME-SERVER
  client:
    service-url:
      defaultZone: http://127.0.0.1:20001/eureka/

同样的,在consume-server服务的启动类加上能被服务发现的注解@EnableDiscoveryClient,完成之后启动注册中心以及consume-server和provide-server两个服务:

红框中的内容大家现在可以不用关心,这个是Eureka的高可用实现,下一节会和大家分享。

启动完成之后,现在开始实现服务的调用。

首先在provide-server中创建一个ProvideController.java和一个方法,我们会在consume-server中远程调用这个方法

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import priv.cwr.model.entity.UserEntity;

/**
 * User: R
 * Date: 2018/10/16
 * Time: 17:03
 * Created with IntelliJ IDEA.
 */
@RestController
@RequestMapping("/provide")
public class ProvideController {

    /**
     * 查询单个用户
     *
     * @return
     */
    @GetMapping("/find-one-user")
    public UserEntity findAllUser() {
        System.out.println("/find-one-user");
        return new UserEntity(1001L, "张三");
    }
}

UserEntity.java

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * User: R
 * Date: 2018/10/16
 * Time: 17:02
 * Created with IntelliJ IDEA.
 */
@Data
@AllArgsConstructor
public class UserEntity {
    private Long userId;
    private String name;
}

然后再在consume-server中创建一个ConsumeController.java和一个测试方法,其中两个服务的UserEntity是一样的

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import priv.cwr.controller.model.entity.UserEntity;

/**
 * User: R
 * Date: 2018/10/16
 * Time: 17:01
 * Created with IntelliJ IDEA.
 */
@RestController
@RequestMapping("/consume")
public class ConsumeController {
    private final RestTemplate restTemplate;

    public ConsumeController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }
    /**
     * 测试远程服务调用
     *
     * @return
     */
    @GetMapping("/remote-test")
    public UserEntity findOneUser() {
        //第一个参数是请求地址,第二个参数是返回的数据类型
        ResponseEntity responseEntity = this.restTemplate.getForEntity(
                "http://PROVIDE-SERVER/provide/find-one-user", UserEntity.class
        );
        return responseEntity.getBody();
    }
}

要使用RestTemplate必须在调用方(消费方)的启动类中加上如下配置(一个方法):

    /**
     * 默认RestTemplate
     */
    //开启负载均衡,如何没有该注解则不会走Eureka,
    //就会发现不了服务,出现UnknownHostException异常
    @LoadBalanced
    @Bean //必须new 一个RestTemplate并放入spring容器当中,否则启动时报错
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

完成之后,重新启动两个服务,访问http://127.0.0.1:40001/consume/remote-test

搭建Spring Cloud Eureka服务注册中心(二)服务调用_第1张图片

使用RestTemplate进行简单的服务调用这样就完成了,RestTemplate还有很多功能,感兴趣的话大家可以自己好好研究一下。

2、客户端负载均衡(Ribbon)

刚才实现的是单节点服务的调用,现在再多开启两个provide-server服务(端口:30002和30003),模拟一个provide-server服务的集群,然后通过负载均衡的方式去调用服务(需要加上@LoadBlanced注解,引入Ribbon)。

新启动两个provide-server服务:

多访问几次http://127.0.0.1:40001/consume/remote-test,然后查看provide-server服务的三个控制台

Ribbon默认的负载均衡策略是轮询的方式,所以这时候通过控制台的输出顺序可以看的出负载均衡的效果。

搭建Spring Cloud Eureka服务注册中心(二)服务调用_第2张图片

搭建Spring Cloud Eureka服务注册中心(二)服务调用_第3张图片

搭建Spring Cloud Eureka服务注册中心(二)服务调用_第4张图片

你可能感兴趣的:(微服务,SpringCloud)