05、SpringCloud实战:基于服务发现获取并访问远程接口

目录

1、 在springcloud-order项目中新建controller供外部远程访问;

2、 在springcloud-member项目中新建controller去访问远程接口;

3、 运行springcloud-eureka、springcloud-member、springcloud-order项目的启动类;

4、 访问member服务的接口,通过member服务调用order服务;

5、 在order服务中添加新的接口,并启动多个order服务进行验证负载均衡;

6、 在member服务中手动模拟负载均衡算法(轮询);

7、 访问member服务的接口,通过member服务调用order服务;


通过DiscoveryClient 服务发现机制从eureka注册中心获取服务实例(这样我们用restTemplate访问远程接口时就不用写死服务地址,避免服务提供者地址变更造成每个用到该服务的服务消费者都需要修改)

discoveryClient.getInstances("xxx");xxx为服务名称,该方法获取对应服务名称的实例信息,如主机、端口号等。然后解析获取的信息,并通过拼接url的形式生成远程接口,最后通过RestTemplate访问。示例如下:

1、在springcloud-order项目中新建controller供外部远程访问

1、@RestController
@RequestMapping("/order")
public class OrderController {

    @GetMapping("/orderInfo")
    public String OrderInfo() {
        return "this is Order Info";
    }
}

2、在springcloud-member项目中新建controller去访问远程接口

@RestController
@RequestMapping("/member")
public class MemberController {
    //注入RestTemplate
    @Autowired
    private RestTemplate template;

    // 注入DiscoveryClient服务发现
    @Autowired
    private DiscoveryClient discoveryClient;

    //DiscoveryClient服务发现机制获取服务,拼接接口
    @GetMapping("/getOrderInfoByDiscoveryClient")
    public String getOrderInfoByDiscoveryClient() {
        List<ServiceInstance> instancesList = discoveryClient.getInstances("server-order");
        ServiceInstance instance = instancesList.get(0);
        String host = instance.getHost();
        int port = instance.getPort();
        String url = "http://" + host + ":" + port + "/order/orderInfo";
        return template.getForObject(url, String.class);
    }
 }

3、运行springcloud-eureka、springcloud-member、springcloud-order项目的启动类

*

4、访问member服务的接口,通过member服务调用order服务

*

5、在order服务中添加新的接口,并启动多个order服务进行验证负载均衡

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

    @GetMapping("/orderInfo")
    public String OrderInfo() {
        return "this is Order Info";
    }

    @GetMapping("/getOrderInfo")
    public String getOrderInfo() {
        return "当前端口为:" + port + "   this is Order Info";
    }

}

*

6、在member服务中手动模拟负载均衡算法(轮询)

@RestController
@RequestMapping("/member")
public class MemberController {
    //注入RestTemplate
    @Autowired
    private RestTemplate template;

    // 注入DiscoveryClient服务发现
    @Autowired
    private DiscoveryClient discoveryClient;

    private int count = 0;

    //DiscoveryClient服务发现机制访问接口(自己简单写一下轮询访问)
    @GetMapping("/getOrderInfoByDiscoveryClientWithBalance")
    public String getOrderInfoByDiscoveryClientWithBalance() {
        List<ServiceInstance> instancesList = discoveryClient.getInstances("server-order");
        int size = instancesList.size();
        count++;
        int index = count % size;
        ServiceInstance instance = instancesList.get(index);
        String host = instance.getHost();
        int port = instance.getPort();
        String url = "http://" + host + ":" + port + "/order/orderInfo";
        return "当前访问服务端口为:" + port + "  ; " + template.getForObject(url, String.class);
    }
}

7、访问member服务的接口,通过member服务调用order服务

*

*

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: