【Ribbon】 Eureka 快速开始

Metadata

title: 【Ribbon】 Eureka 快速开始
date: 2023-01-09 17:17
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/Ribbon
categories:
  - Ribbon
keywords:
  - Ribbon
description: 【Ribbon】 Eureka 快速开始

导入 Maven 依赖

<dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon</artifactId>
    <version>2.2.5</version>
</dependency>
<dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon-core</artifactId>
    <version>2.2.5</version>
</dependency>
<dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon-httpclient</artifactId>
    <version>2.2.5</version>
</dependency>
<dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon-loadbalancer</artifactId>
    <version>2.2.5</version>
</dependency>
<dependency>
    <groupId>com.netflix.archaius</groupId>
    <artifactId>archaius-core</artifactId>
    <version>0.7.4</version>
</dependency>
<dependency>
    <groupId>commons-configuration</groupId>
    <artifactId>commons-configuration</artifactId>
    <version>1.8</version>
</dependency>
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>16.0.1</version>
</dependency>

配置文件

# Max number of retries
user.ribbon.MaxAutoRetries=1
 
# Max number of next servers to retry (excluding the first server)
user.ribbon.MaxAutoRetriesNextServer=1
 
# Whether all operations can be retried for this client
user.ribbon.OkToRetryOnAllOperations=true
 
# Interval to refresh the server list from the source
user.ribbon.ServerListRefreshInterval=2000
 
# Connect timeout used by Apache HttpClient
user.ribbon.ConnectTimeout=3000
 
# Read timeout used by Apache HttpClient
user.ribbon.ReadTimeout=3000
 
# Initial list of servers, can be changed via Archaius dynamic property at runtime
user.ribbon.listOfServers=localhost:7001,localhost:7002,localhost:7003
user.ribbon.EnablePrimeConnections=true

# 端口不需要指定,通过命令行动态指定
spring:
  application:
    name: user
 
# 服务地址
eureka:
  instance:
    hostname: localhost
    # 心跳间隔5s,默认30s。每一个服务配置后,心跳间隔和心跳超时时间会被保存在server端,
    # 不同服务的心跳频率可能不同,server 端会根据保存的配置来分别探活
    lease-renewal-interval-in-seconds: 5
    # 心跳超时时间10s,默认90s。从client端最后一次发出心跳后,达到这个时间没有再次发出
    # 心跳,表示服务不可用,将它的实例从注册中心移除
    lease-expiration-duration-in-seconds: 10
  client:
    service-url:
      # 注册中心路径,表示我们向这个注册中心注册服务,如果向多个注册中心注册,用“,”进行分隔
      defaultZone: http://localhost:8077/eureka    

RibbonConfig.java

该类是一个 @Configuration 配置类,该类配置了一个 RestTemplate Bean,并且该 RestTemplate Bean 上面应用了@LoadBalanced 注解,因此启用了负载均衡调用。代码如下:

package com.huangx.springcloud.ribbon;
 
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
 
@Configuration
public class RibbonConfig {
 
    @Bean
    @LoadBalanced
    /** 启动负载均衡 */
    public RestTemplate restTemplate() {
        System.out.println(RibbonConfig.class.getName() + " :: restTemplate()");
        return new RestTemplate();
    }
 
}

应用

package com.huangx.springcloud.ribbon;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
 
import javax.servlet.http.HttpServletResponse;
 
@RestController
public class HelloControler {
 
   @Autowired
    private RestTemplate restTemplate;
 
    @Autowired
    private LoadBalancerClient loadBalancer;
 
    /**
     * 使用注入的 RestTemplate 实现服务调用,开启了负载均衡
     * @return
     */
    @RequestMapping(value = "/testTemplate")
    public String testTemplate(){
        // user 是服务名,下面将根据服务名进行调用,不能使用IP地址进行调用
        String str = restTemplate.getForObject("http://user/info", String.class);
        System.out.println(str);
        return str;
    }
 
    /**
     * 使用 LoadBalancerClient 去实现手动调用服务
     * @return
     */
    @RequestMapping(value = "/testLoadBalancerClient")
    public String testLoadBalancerClient(HttpServletResponse response) {
        response.setHeader("Content-Type", "text/html; charset=UTF-8");
 
        ServiceInstance instance = loadBalancer.choose("user");
        if(null == instance) {
            return "ServiceInstance is null";
        }
        // 服务地址
        String str = instance.getServiceId() + " " + instance.getHost()
                + ":" + instance.getPort();
        // 调用服务
        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/info";
        RestTemplate template = new RestTemplate();
        str += "<br/>调用结果:" + template.getForObject(url, String.class);
 
        System.out.println(str);
        return str;
    }
 
}
package com.huangx.springcloud.ribbon;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
 
@Controller
@SpringBootApplication
/** 标记这是Eureka客户端 */
@EnableDiscoveryClient
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(RibbonDemo3Application.class, args);
    }
}

多服务启动

# 服务1
java -jar ribbon_service_user-0.0.1-SNAPSHOT.jar --appName=user1 --server.port=7001 --eureka.instance.instance-id=user1
 
# 服务2
java -jar ribbon_service_user-0.0.1-SNAPSHOT.jar --appName=user2 --server.port=7002 --eureka.instance.instance-id=user2
 
# 服务3
java -jar ribbon_service_user-0.0.1-SNAPSHOT.jar --appName=user3 --server.port=7003 --eureka.instance.instance-id=user3

运行结果