极简SpringCloud全家桶之服务 Provider 和 Consumer

前言

极简SpringCloud全家桶之IDEA搭建Eureka集群
上篇文章中,我们讲了搭建Eureka集群。下面我们学习服务提供者和消费者的时候,就直接启动一个Eureka来做演示。
创建一个单实例Eureka的配置文件
application-single.yml

server:
  port: 7901
eureka:
  instance:
    hostname: eureka-7901
  client:
    service-url:
      defaultZone: http://eureka-7901:7901/eureka/

指定服务启动时的配置文件
application.yml

spring:
  application:
    name: eureka
  profiles:
    active: single

Provider

新建一个服务提供者 Provider
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改provider的配置文件
设置 provider 端口为 8080

eureka:
  client:
    service-url:
      defaultZone: http://eureka-7901:7901/eureka/
server:
  port: 8080
spring:
  application:
    name: provider

Consumer

创建一个Controller

package com.example.provider;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MainController {

    @GetMapping("/hi")
    public String getHi(){
        return "hi";
    }
}

启动!
打开 http://localhost:7901/ 可以看到 provider 已经注册到 Eureka 上了
在这里插入图片描述
打开浏览器测试一下
http://localhost:8080/hi
浏览器返回 hi
在这里插入图片描述
成功!
下面创建一个 Consumer
跟创建 Provider 过程一个,生成项目以后修改下配置文件
application.yml

eureka:
  client:
    service-url:
      defaultZone: http://eureka-7901:7901/eureka/
server:
  port: 8081
spring:
  application:
    name: consumer

创建一个 Controller 以便后续测试之用

package com.example.consumer;

import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class MainController {

    @Autowired
    DiscoveryClient dc;

    @Qualifier("eurekaClient")
    @Autowired
    private EurekaClient ec;

    @Autowired
    LoadBalancerClient lb;

	//以下方法且为测试代码,都可以删掉
	
    @GetMapping("/client")
    public String client() {
        List<String> services = dc.getServices();
        for (String str :
                services) {
            System.out.println("str = " + str);
        }
        return "hi";
    }

    @GetMapping("/client2")
    public Object client2() {
        return dc.getInstances("provider");
    }

    @GetMapping("/client3")
    public Object client3() {
        List<ServiceInstance> instances = dc.getInstances("provider");
        for (ServiceInstance s :
                instances) {
            System.out.println(ToStringBuilder.reflectionToString(s));
        }
        return "success";
    }

    @GetMapping("/client4")
    public Object client4() {

        //根据 <instanceId>192.168.0.164:provider:8080</instanceId> 找到具体服务
        //List<InstanceInfo> instances = ec.getInstancesById("192.168.0.164:provider:8080");

        //使用服务名,找到服务列表
        List<InstanceInfo> instances = ec.getInstancesByVipAddress("provider", false);

        for (InstanceInfo ins : instances) {
            System.out.println(ToStringBuilder.reflectionToString(ins));
        }

        if (instances.size() > 0) {
            //取第一个服务
            InstanceInfo instanceInfo = instances.get(0);
            if (instanceInfo.getStatus() == InstanceInfo.InstanceStatus.UP) {
                String url = "http://" + instanceInfo.getHostName() + ":" + instanceInfo.getPort() + "/hi";
                System.out.println("url = " + url);
                RestTemplate restTemplate = new RestTemplate();
                String forObject = restTemplate.getForObject(url, String.class);
                System.out.println("forObject = " + forObject);
            }
        }
        return "1";
    }

    @GetMapping("/client5")
    public Object client5() {

        //ribbon 完成客户端负载均衡,并过滤掉 DOWN 了的节点
        ServiceInstance instance = lb.choose("provider");

        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/hi";
        System.out.println("url = " + url);
        RestTemplate restTemplate = new RestTemplate();
        String forObject = restTemplate.getForObject(url, String.class);
        System.out.println("forObject = " + forObject);
        return forObject;
    }
}

启动 Consumer
在这里插入图片描述
启动成功!
可以看到 Provide 和 Consumer 都注册到Eureka上了

下面我们在浏览器输入

假设我们有多个 provider 的话,基本就达成下面这种状态了。
在这里插入图片描述
并且我们在 Consumer 的代码中 /client5 中使用了客户端负载均衡Ribbon
在这里插入图片描述

参考资料

https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
在这里插入图片描述
在我们项目中,可以使用

http://localhost:7901/eureka/apps

来查看 eureka 上注册的所有实例的信息

官网地址里的 v2 不知道干嘛用的,带上就出不来,去掉就正常了

代码仓库

GitHub:https://github.com/xiuqiang1995/Spring-Cloud

发布了84 篇原创文章 · 获赞 10 · 访问量 4414

猜你喜欢

转载自blog.csdn.net/AlphaBr/article/details/105644156