3.添加服务调用者

在原有基础上添加服务调用者。大体思路为:

第一步、创建eureka注册中心;

第二步、注册服务;

第三步、调用服务;

前两步骤可以参考文章。

一、创建调用服务程序

创建web项目,用来消费服务。

实现功能:获取eureka服务中的服务列表、获取指定服务、获取指定服务并且通过RestTemplate方式消费服务、修改Ribbon负载均衡策略。

pom文件配置

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client
</artifactId>
</dependency>
    <!--     spring-cloud-starter-netflix-eureka-client 需要手动引入actuator包   -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

配置文件,向eureka注册服务

# 应用名称
spring.application.name=customer
# 应用服务 WEB 访问端口
server.port=8002
eureka.client.service-url.defaultZone=http://euk1.com:7001/eureka/

服务

 @Autowired
    DiscoveryClient client;

    @Autowired
    EurekaClient eurekaClient;

    /**
     * Ribbon获取服务
     */
    @Autowired
    LoadBalancerClient lb;

    /**
     * 获取服务列表
     * @return
     */
    @GetMapping("getServers")
    public Object getServers() {
        List<String> services = client.getServices();
        return services;
    }

    /**
     * 获取指定的服务
     * @return
     */
    @GetMapping("listServersById")
    public Object getServerById() {
        List<ServiceInstance> provider = client.getInstances("provider");
        return provider;
    }

    /**
     * 输出指定服务的所有信息
     * @return
     */
    @GetMapping("getServerDetail")
    public Object getServerDetail() {
        List<ServiceInstance> provider = client.getInstances("provider");
        provider.forEach(e->{
            System.out.println(ToStringBuilder.reflectionToString(e));
        });
        return provider;
    }

    /**
     * 获取指定服务,并且通过resttemplate调用响应服务
     * @return
     */
    @GetMapping("sendProvider")
    public Object sendProvider() {
//        具体服务
//        List<InstanceInfo> provider = eurekaClient.getInstancesById("LAPTOP-CCRUI6V2:provider:8001");
        List<InstanceInfo> provider = eurekaClient.getInstancesByVipAddress("provider", false);
        provider.forEach(e->{
            System.out.println(ToStringBuilder.reflectionToString(e));
        });
        if (provider.size() > 0){
            //
            InstanceInfo instanceInfo = provider.get(0);
            if (instanceInfo.getStatus() == InstanceInfo.InstanceStatus.UP){
                // 拼装url
                String url = "http://" + instanceInfo.getHostName() + ":" + instanceInfo.getPort() + "/getPort";
                RestTemplate restTemplate = new RestTemplate();
                String forObject = restTemplate.getForObject(url, String.class);
                return forObject;
            }
        }
        return provider;
    }

    /**
     * 服务的负载均衡
     * @return
     */
    @GetMapping("client5")
    public Object client5() {
//        具体服务
        // ribbon完成客户端的负载均衡
        ServiceInstance instanceInfo = lb.choose("provider");
        // 组装数据
        String url = "http://" + instanceInfo.getHost() + ":" + instanceInfo.getPort() + "/getPort";
        RestTemplate restTemplate = new RestTemplate();
        String forObject = restTemplate.getForObject(url, String.class);
        return forObject;
    }

二、测试

打开eureka管理页面

 测试服务调用者”customer“是否正常,点击status对应的url,通过修改url,进行测试

1.获取服务列表 http://laptop-ccrui6v2:8002/getServers

2.获取指定服务http://laptop-ccrui6v2:8002/listServersById

 ......

n-1:取指定服务,并且通过resttemplate调用响应服务

http://laptop-ccrui6v2:8002/sendProvider 

输出的端口是固定的。

n: 采用负载均衡策略调用服务:http://laptop-ccrui6v2:8002/client5

会轮询端口。

三、扩展

3.1 Ribbon策略修改

方法一:注入形式

@Bean
    public IRule myRule() {
        return new RandomRule();
    }

方法二:配置文件指明

provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

方法三:自定义

参考:自定义ribbon负载均衡策略 -阿里云开发者社区

3.2 获取服务的url,不需要进行拼接

依靠@LoadBalanced注解

@Bean
    @LoadBalanced
    RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

使用

 // 组装数据
        String url = "http://provider/getPort";
        String forObject = restTemplate.getForObject(url, String.class);

3.3 调用者,调用指定服务

调用者,调用指定服务,忽略负载均衡策略;

#关闭eureka
ribbon.eureka.enabled=false
#本地直连
ribbon.listOfServers=localhost:8000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值