spring cloud学习——16. Client Side Load Balancer: Ribbon

启动几个项目,有

8761 Eureka server,是服务端

microservice-provider-user 启动7900,7901,是服务提供者

microservice-provider-user2 启动7902,7903,是服务提供者

microservice-customer-movie-ribbon 启动8010,是服务消费者



16.2. Customizing the Ribbon Client

在项目microservice-customer-movie-ribbon中

TestConfiguration。注意他不可以放在启动类的@ComponentScan可以扫描的包下面。(启动类可以扫描到同一目录或者子包下面可以的注解

package com.ldgx.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

/**
 * The TestConfiguration has to be @Configuration but take care that it is not in a @ComponentScan for the main application context, 
 * otherwise it will be shared by all the @RibbonClients. If you use @ComponentScan (or @SpringBootApplication) 
 * you need to take steps to avoid it being included (for instance put it in a separate, non-overlapping package, or specify the packages to scan explicitly in the @ComponentScan).
 * @author Administrator
 *
 */
@Configuration
public class TestConfiguration {

	//@Autowired
	//private IClientConfig config;
	
	@Bean
	public IRule ribbonRule(IClientConfig config) {
		return new RandomRule();//随机规则
	}
}

启动类com/ldgx/eshop/MicroserviceCustomerMovie1Application.java增加

@RibbonClient(name="microservice-provider-user",configuration = TestConfiguration.class)

Controller

package com.ldgx.eshop.controller;

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;

@RestController
public class UseDemoController {

	@Autowired
	private RestTemplate restTemplate;
	
	@Autowired
	private LoadBalancerClient loadBalanceClient;
	
	@RequestMapping("/demo")
	public String useDemo() {
		return restTemplate.getForObject("http://microservice-provider-user/demo/dd", String.class);//参数1使eureka的service-id,是个虚拟主机名,可以用eureka.instance.secure.virtual-host-name定义,如果不是https的,就用eureka.instance.virtual-host-name
	}
	
	@RequestMapping("/test")
	public String test() {
		ServiceInstance instance = this.loadBalanceClient.choose("microservice-provider-user");
		System.out.println(instance.getHost() + "," + instance.getPort() +","+instance.getServiceId());
		ServiceInstance instance2 = this.loadBalanceClient.choose("microservice-provider-user2");
		System.out.println(instance2.getHost() + "," + instance2.getPort() +","+instance2.getServiceId());
		return "1";
	}
}

当在浏览器上访问地址http://localhost:8010/test的时候

项目microservice-customer-movie-ribbon打印结果:

IDXZC2FNKSQOYM6,7900,microservice-provider-user
IDXZC2FNKSQOYM6,7903,microservice-provider-user2
IDXZC2FNKSQOYM6,7901,microservice-provider-user
IDXZC2FNKSQOYM6,7902,microservice-provider-user2
IDXZC2FNKSQOYM6,7901,microservice-provider-user
IDXZC2FNKSQOYM6,7903,microservice-provider-user2
IDXZC2FNKSQOYM6,7900,microservice-provider-user
IDXZC2FNKSQOYM6,7902,microservice-provider-user2
IDXZC2FNKSQOYM6,7900,microservice-provider-user
IDXZC2FNKSQOYM6,7903,microservice-provider-user2
IDXZC2FNKSQOYM6,7901,microservice-provider-user
IDXZC2FNKSQOYM6,7902,microservice-provider-user2
IDXZC2FNKSQOYM6,7901,microservice-provider-user
IDXZC2FNKSQOYM6,7903,microservice-provider-user2
IDXZC2FNKSQOYM6,7900,microservice-provider-user
IDXZC2FNKSQOYM6,7902,microservice-provider-user2
IDXZC2FNKSQOYM6,7901,microservice-provider-user
IDXZC2FNKSQOYM6,7903,microservice-provider-user2
IDXZC2FNKSQOYM6,7900,microservice-provider-user
IDXZC2FNKSQOYM6,7902,microservice-provider-user2
得到结果:microservice-provider-user是随机的, microservice-provider-user2是默认的规则(轮询)


问题:如果想Configuration移动到其它包怎么办那?

定义标签

package com.ldgx.eshop;

public @interface ExcludeFromComponent {

}

TestConfiguration类增加

@ExcludeFromComponent
启动类增加

@ComponentScan(excludeFilters = {@ComponentScan.Filter(type=FilterType.ANNOTATION,value=ExcludeFromComponent.class)})//不扫描注解ExcludeFromComponent注解的类

16.4 Customizing the Ribbon Client using properties



application.yml,重点

NFLoadBalancerRuleClassName:负载均衡的算法

microservice-provider-user:   
  ribbon:   
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule 

运行结果如上,得出结论:microservice-provider-user采用了随机原则,microservice-provider-user2采用了轮询的原则。

16.5 Using Ribbon with Eureka

在spring.application.name=microservice-provider-userde元数据

eureka.instance.metadata-map.zone=ABC #eureka可以理解的元数据
eureka.instance.metadata-map.lilishow=BBC  #不会影响客户端的元数据

在浏览器输入地址http://localhost:8761/eureka/apps/microservice-provider-user

得到


16.6 Example: How to Use Ribbon Without Eureka

ribbon:
  eureka:
   enabled: false #如果classpath下面有eureka,怎么禁用(Disable Eureka use in Ribbon)
microservice-provider-user: 
  ribbon:
    listOfServers: localhost:7900
运行结果

localhost,7900,microservice-provider-user
localhost,7900,microservice-provider-user
localhost,7900,microservice-provider-user
localhost,7900,microservice-provider-user
localhost,7900,microservice-provider-user
localhost,7900,microservice-provider-user
localhost,7900,microservice-provider-user
得出结果,禁用了ribbon负载均衡,只调用了7900端口



猜你喜欢

转载自blog.csdn.net/fulq1234/article/details/79272142