import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Primary;

import org.springframework.web.client.RestTemplate;

@SpringBootApplication

@EnableDiscoveryClient

public class RibbonConsumerApplication {

@Bean

@LoadBalanced // 需要使用负载均衡,必须与Bean一同使用

public RestTemplate balanceRestTemplate() {

return new RestTemplate();

}

@Primary //自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

@Bean //需要多个RestTemplate, 有的RestTemplate使用负载均衡,有的不使用,不使用的不增加@LoadBalanced注解

public RestTemplate noBalanceRestTemplate() {

return new RestTemplate();

}

public static void main(String[] args) {

SpringApplication.run(RibbonConsumerApplication.class, args);

}

}

3、编写 Controller——演示使用负载均衡和不使用负载均衡的用法及区别

package com.mimaxueyuan.consumer.robbin.controller;

import java.net.URI;

import java.net.URISyntaxException;

import java.util.List;

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.loadbalancer.LoadBalancerClient;

import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;

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;

import com.mimaxueyuan.consumer.entity.User;

@RestController

public class RibbonController {

// 注入restTemplate, 这个类已经在RibbonConsumerApplication中初始化,不使用负载均衡

@Autowired

private RestTemplate noBalanceRestTemplate;

// 注入restTemplate, 这个类已经在RibbonConsumerApplication中初始化,并且使用负载均衡

@Autowired // 默认按照类型注入,如果需要按照名字注入需要使用@Qualifier注解

//@LoadBalanced //使用带有负载均衡的RestTemplate

@Qualifier(“balanceRestTemplate”)

private RestTemplate balanceRestTemplate;

// 以下注入负载均衡客户端LoadBalancerClient是一个接口,下面只有一个RibbonLoadBalancerClient实现类

@Autowired

private LoadBalancerClient loadBalancerClient;

@Autowired

private RibbonLoadBalancerClient ribbonLoadBalancerClient;

/**

  • 不使用ribbon的旧调用方式

  • @author Kevin

  • @Title: old

  • @return

  • @return: String

*/

@GetMapping(“/ribbon/old/get/{id}”)

public String old(@PathVariable(“id”) String id) {

// 使用noBalanceRestTemplate是非负载均衡的,所以没问题

String result = noBalanceRestTemplate.getForObject(“http://localhost:9907/get/”+id, String.class);

System.out.println(“[hardcode1]” + result);

// 由于balanceRestTemplate已经使用了Ribbon做负载均衡,所以使用硬编码方式就不允许了,会提示:No instances available for localhost

result = balanceRestTemplate.getForObject(“http://localhost:9907/get/”+id, String.class);

System.out.println(“[hardcode2]” + result);

return “result”;

}

/**

  • ribbon使用

  • @author Kevin

  • @Title: ribbon

  • @param id

  • @return

  • @return: String

*/

@GetMapping(“/ribbon/get/{id}”)

public String ribbon(@PathVariable(“id”) String id) {

// -----------------以下代码使用ribbon做客户端负载均衡

// 使用provider的instanceName替代ip和端口的硬编码

String result = balanceRestTemplate.getForObject(“http://mima-cloud-producer/get/”+id, String.class);

System.out.println(“[ribbon]” + result);

System.out.println(“[loadBalancerClient]choose的结果,代表负载均衡之后要选择的服务实例”);

ServiceInstance instance = loadBalancerClient.choose(“mima-cloud-producer”);

System.out.println(“host:” + instance.getHost() + “,port:” + instance.getPort() + “,serviceId=” + instance.getServiceId() + “,uri=” + instance.getUri());

System.out.println(“[ribbonLoadBalancerClient]choose的结果,代表负载均衡之后要选择的服务实例”);

instance = ribbonLoadBalancerClient.choose(“mima-cloud-producer”);

System.out.println(“host:” + instance.getHost() + “,port:” + instance.getPort() + “,serviceId=” + instance.getServiceId() + “,uri=” + instance.getUri());

System.out.println(“[ribbonLoadBalancerClient]choose的结果,代表负载均衡之后要选择的服务实例”);

instance = ribbonLoadBalancerClient.choose(“mima-cloud-producer”);

System.out.println(“host:” + instance.getHost() + “,port:” + instance.getPort() + “,serviceId=” + instance.getServiceId() + “,uri=” + instance.getUri());

try {

// 根据负载均衡后的服务,构建一个访问url

// 第二个参数不能为null

System.out.println(“根据负载均衡后的服务,构建一个访问url”);

URI reconstructURI = ribbonLoadBalancerClient.reconstructURI(instance, new URI(“”));

System.out.println(“reconstructURI1-yes:” + reconstructURI);

// 拼写在请求地址后边,需要注意是否需要添加/

reconstructURI = ribbonLoadBalancerClient.reconstructURI(instance, new URI(“/ribbon/get”));

System.out.println(“reconstructURI2-yes:” + reconstructURI);

reconstructURI = ribbonLoadBalancerClient.reconstructURI(instance, new URI(“http”));

System.out.println(“reconstructURI3-no:” + reconstructURI);

reconstructURI = ribbonLoadBalancerClient.reconstructURI(instance, new URI(“https”));

System.out.println(“reconstructURI4-no:” + reconstructURI);

reconstructURI = ribbonLoadBalancerClient.reconstructURI(instance, new URI(“test”));

System.out.println(“reconstructURI5-no:” + reconstructURI);

// 使用http:/xxx、https:/xxx可以用于切换http协议还是https协议

reconstructURI = ribbonLoadBalancerClient.reconstructURI(instance, new URI(“http:/ribbin/get”));

System.out.println(“reconstructURI6-yes:” + reconstructURI);

reconstructURI = ribbonLoadBalancerClient.reconstructURI(instance, new URI(“https:/ribbin/get”));
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行

腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

最后

[外链图片转存中…(img-KBYyJEtw-1713301251398)]

[外链图片转存中…(img-COy1MEg4-1713301251399)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐