三、Spring Cloud 的 Ribbon 负载均衡

一、Eureka Server 端的YML 文件配置加了一个禁止自我保护


        与Ribbon无关

        在此只加了一个enable-self-preservation为false,禁止Eureka Server 端自我保护

spring:
  application:  
    name: microservice-eureka-server-ha1
  # 指定 profile=peer1
  profiles: peer1
server:
  port: 8761
eureka:
  server:
    enable-self-preservation: false  #禁用自我保护模式, 默认为true
  instance:
    hostname: peer1
  client:
    #register-with-eureka: false   #表示是否将自己注册到Eureka Server中,默认为true, 由于当前应用就是 Eureka Server, 故而设置为false
    #fetch-registry: false         #表示是否从 Eureka Server中获取注册信息, 默认为true, 因为这是一个单点的 Eureka Server, 不需要同步其它的 Eureka Server 节点的数据, 故而设置为 false
    service-url:
      defaultZone: http://user:password123@peer2:8762/eureka/  # 设置与Eureka Server交互的地址, 查询服务和注册服务都需要依赖这个地址. 默认http://localhost:8761/eureka; 多个地址可以使用","分隔
security:
  basic:
    enabled: true
  user:
    name: user
    password: password123   

---
spring:
  application:  
    name: microservice-eureka-server-ha2
  # 指定 profile=peer2
  profiles: peer2
server:
  port: 8762
eureka:
  server:
    enable-self-preservation: false  #禁用自我保护模式, 默认为true
  instance:
    hostname: peer1
  client:
    #register-with-eureka: false   #表示是否将自己注册到Eureka Server中,默认为true, 由于当前应用就是 Eureka Server, 故而设置为false
    #fetch-registry: false         #表示是否从 Eureka Server中获取注册信息, 默认为true, 因为这是一个单点的 Eureka Server, 不需要同步其它的 Eureka Server 节点的数据, 故而设置为 false
    service-url:
      defaultZone: http://user:password123@peer1:8761/eureka/  # 设置与Eureka Server交互的地址, 查询服务和注册服务都需要依赖这个地址. 默认http://localhost:8761/eureka; 多个地址可以使用","分隔
security:
  basic:
    enabled: true
  user:
    name: user
    password: password123


二、Ribbon Eureka Client 客户端实现

         1) Eureka 客户端的 pom.xml 文件配置


			org.springframework.cloud
			spring-cloud-starter-ribbon
		


         2) 主程序文件添加注解@LoadBalanced

package com.itmuch.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class CloudConsumerApplication {

	@Bean          // 等价于 RestTemplate restTemplate = new RestTemplate();
	@LoadBalanced  // Ribbon 负载均衡
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
	
	public static void main(String[] args) {
		SpringApplication.run(CloudConsumerApplication.class, args);
	}
	
}

        3) Controller 控制台调用

package com.itmuch.cloud;

import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.client.ServiceInstance;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class UserController {
	
	@Value("${user.userServiceUrl}")   // 在yml文件中已经配置, 解决它的硬编码问题
	private String userServiceUrl;
	
	@Value("${user.userEurekaService}")
	private String userEurekaService;
	
	@Value("${user.userEurekaName}")    
	private String userEurekaName;

	@Autowired
	private RestTemplate restTemplate;
	
	@Autowired
	private DiscoveryClient discoveryClient;
	
	@Autowired
	private LoadBalancerClient loadBalancerClient;
	
	@GetMapping("/load-instance")
	public String loadEurekaInstance() {
		ServiceInstance serviceInstance = this.loadBalancerClient.choose("cloud-service");
		String rs = "{" + serviceInstance.getServiceId() + ":" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "}";
		// 打印当前选择的是哪个节点
		System.out.println(rs);
		return rs;
	}
	
	/**
	 * #1 第一种   基于Eureka服务方式来调用 
	 * 
	 * @param id
	 * @return
	 */
	@GetMapping("/eureka/{id}")  
	public User findByIdEureka(@PathVariable Long id) {
		User user = this.restTemplate.getForObject("http://cloud-service/get/" + id, User.class);
		
		String rs = loadEurekaInstance();
		user.setEurekaServiceName(rs);
		
		return user;
	}
	
}


三、测试

   1) 启动HA的Eureka服务

   2) 启动3-5个提供者

   3) 启动消费者去调用

   4) 杀掉一个提供者,测试一下Ribbon会不会再访问它, 在本文第一节禁止了Eureka Server自我保护功能








你可能感兴趣的:(Spring,Cloud)