Spring Cloud:第三章:Ribbon客服端负载均衡,看完直接怼产品经理

// 以下注入负载均衡客户端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”));

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

} catch (URISyntaxException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return “ribbon’s demo,please to see console output”;

}

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

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

// -----------------以下代码使用硬编码方式调用服务

// 如果restTemplate已经使用了Ribbon做负载均衡,也就是使用了@LoadBaleced注解,依然使用硬编码方式就不允许了,会提示:No instances available for localhost

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

System.out.println(“[noBalanceRestTemplate-hardcode1]” + result); //正常访问

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

System.out.println(“[noBalanceRestTemplate-hardcode2]” + result); //正常访问

try {

//异常访问,Ribbon负载均衡只能通过服务名调用

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

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

//异常访问,Ribbon负载均衡只能通过服务名调用

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

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

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

最后,强调几点:

  • 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
  • 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
  • 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。

面试答案

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。

面试答案

[外链图片转存中…(img-xe8sNPUM-1711786480339)]

[外链图片转存中…(img-fa21gZTv-1711786480339)]

[外链图片转存中…(img-5OqUw1Hd-1711786480340)]

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值