三、Spring Cloud之软负载均衡 Ribbon,linux视频

SpringCloud

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

1.0.0

com.quellanan.springcloud

ribbon-provider-9004

1.0.0

ribbon-provider-9004

ribbon-provider-9004 服务提供者

org.springframework.boot

spring-boot-starter-web

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

主要就是引入了eureka-client 可以注册到注册中心去,然后启动类加上@EnableEurekaClient 注解

在这里插入图片描述

在配置文件中加上配置如下:

server.port=9004

spring.application.name=ribbon-provider

eureka.client.service-url.defaultZone=http://localhost:8000/eureka/

我们在创建一个测试类:HelloController

@RestController

@Slf4j

public class HelloController {

@Value("${server.port}")

private String port;

@RequestMapping("/hello")

public String hello(){

log.info(port);

return "hello "+port;

}

}

这样我们一个服务提供者就弄好了,为了看出负载均衡的效果,我们还需要创建一个一样的服务提供者。或者不同的端口启动。我们将端口改为9005.其他的和上面一样。

服务消费者


服务提供者有了,我们再来创建一个服务消费者的模块。pom.xml 较服务提供者就多了一个ribbon 的依赖

org.springframework.cloud

spring-cloud-starter-netflix-ribbon

然后启动类中加上@EnableEurekaClient 和 RestTemplate

@SpringBootApplication

@EnableEurekaClient

public class RibbonConsumerApplication {

@Bean

@LoadBalanced

public RestTemplate restTemplate(){

return new RestTemplate();

}

public static void main(String[] args) {

SpringApplication.run(RibbonConsumerApplication.class, args);

}

}

@LoadBalanced 注解就是来实现客户端负载均衡的。

配置文件中加入如下配置:

server.port=9003

#服务名,在注册时所用

spring.application.name=ribbon-consumer

eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

最后我们来写一个调用服务提供者的接口,创建一个IndexController类,内容如下

@RestController

public class IndexController {

private static final String applicationName = “ribbon-provider”;

@Autowired

private RestTemplate restTemplate;

@RequestMapping("/index")

public String getHello(){

String url = “http://”+ applicationName +"/hello";

return restTemplate.getForObject(url,String.class);

}

}

测试


我们现在来启动服务中心,两个服务提供者,一个服务消费者。启动之后我们输入:

http://localhost:8000/

在这里插入图片描述

重点看下ribbon-provider 有两个端口,分别对应的我们的两个服务提供者。他们的appliaction.name是相同的。

再来调下面接口看看

http://localhost:9003/index

在这里插入图片描述

可以看到每次调用访问了不同的服务提供者,两个服务端提供者是轮寻调用的。从而实现客户端的负载均衡

RestTemplate

===========================================================================

上面说的负载均衡,其实还是RestTemplate 对象加上@LoadBalanced来实现的。并且前面只是简单的调用,没有涉及参数和请求方式,接下来我们看看常见的请求方式和有参数的调用。

Get 请求


其实我们之前写的就是get 请求的方式,我们在来写一个有参数的请求

@RequestMapping(“index2”)

public String getHello2(){

String url = “http://”+ applicationName +"/hello2?name={1}";

return restTemplate.getForObject(url,String.class,“quellanan”);

}

可以看到url 中请求的参数有占位符代替,getForObject或者getForEntity的第三个参数就是我们实际传的参数。这里说明一下getForObject 是直接获取返回的内容,而getForEntity返回的是一个http对象,包含相应状态码,想要回去内容需要getForEntity().getBody() 才行。

那如果多个参数的呢?

多个参数的常用的有两种方式,一个是和上面一样,直接在后面加参数就好了如下:

@RequestMapping(“index3”)

public String getHello3(){

//多个参数拼接

String url = “http://”+ applicationName +"/hello3?name={1}&age={2}";

return restTemplate.getForObject(url,String.class,“quellanan”,“18”);

}

还有一种方式就是将参数封装到map 中,传过去。一样的也可以解析

@RequestMapping(“index4”)

public String getHello4(){

//多参数组装

Map<String,String> parms=new HashMap<>();

parms.put(“name”,“quellanan”);

parms.put(“age”,“18”);

String url = “http://”+ applicationName +"/hello3?name={name}&age={age}";

return restTemplate.getForObject(url,String.class,parms);

}

我们在提供者中写两个方法便于测试

@RequestMapping("/hello2")

public String hello2(@RequestParam(“name”) String name){

log.info(name);

return "hello "+name+port;

}

@RequestMapping("/hello3")

public String hello3(@RequestParam(“name”) String name,@RequestParam(“age”) String age){

log.info(name+age);

return "hello "+name+age+port;

}

我们启动来看下结果

在这里插入图片描述

可以看到参数是传递成功的啦。

Post 请求


post 请求和get 请求差不多,我这里就将参数封装到map中了

postForEntity

@RequestMapping(“index6”)

public String getHello6(){

//postForEntity

JSONObject params=new JSONObject();

params.put(“name”,“quellanan”);

params.put(“age”,“18”);

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity request = new HttpEntity(params.toJSONString(), headers);

String url = “http://”+ applicationName +"/hello4";

return restTemplate.postForEntity(url,request,String.class).getBody();

}

postForObject

@RequestMapping(“index7”)

public String getHello7(){

//postForObject

JSONObject params=new JSONObject();

params.put(“name”,“quellanan”);

params.put(“age”,“18”);

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity request = new HttpEntity(params.toJSONString(), headers);

String url = “http://”+ applicationName +"/hello4";

return restTemplate.postForObject(url,params,String.class);

}

主要是先将参数封装在JSONObject 中,然后设置HttpHeaders 和HttpEntity ,然后请求。

我们采用的application/json 的格式,我们在服务提供者中加一个方法。用来接收json格式的参数。

@RequestMapping("/hello4")

public String hello4(@RequestBody Map<String, Object> parms){

return "hello "+parms.get(“name”)+parms.get(“age”)+port;

}

现在我们启动看下效果。

在这里插入图片描述

证明都是可以正常传递的。

Feign 简化微服务调用

============================================================================

上面我们可以看到,我们进行微服务调用,不管是使用get 或者post 方法,带有参数过多就会导致代码变得很臃肿,所以我们就可以使用同样是netflix 推出的Feign 来简化微服务调用,Feign 结合了Ribbon 以及Hystrix.Ribbon的功能它都有,并且还进行了封装,更加方便我们使用。所以我们使用的时候,只用引入 Feign 的依赖就可以。

那我们现在对上面的这些进行调整一下。

pom.xml


在我们的ribbon-consumer 的pom 文件中删除ribbon 的依赖,增加feign 的依赖。

org.springframework.cloud

spring-cloud-starter-openfeign

增加@EnableFeignClients


在启动类中增加@EnableFeignClients 注解

在这里插入图片描述

在启动类中增加了@EnableFeignClients 注解,就可以在项目中使用Fegin 啦,那我们怎么使用呢?

其实还要使用@FeignClient 注解,这个注解是在具体的应用中注入的,用来指定服务提供者的服务名称。并且这个注解只能作用 interface 上。

前面我们调用服务提供者的接口需要写url,参数,返回类型等等非常的繁琐,所以Fegin 就帮我们进行了简化,让我们调用服务提供者的接口,可以像自身调用一样,非常放方便。

HelloService


我们来创建一个HelloService 的接口。内容如下

@FeignClient(“ribbon-provider”)

public interface HelloService {

@RequestMapping("/hello")

public String hello();

@RequestMapping("/hello2")

public String hello2(@RequestParam(value = “name”) String name);

@RequestMapping("/hello3")

public String hello3(@RequestParam(value = “name”) String name,@RequestParam(value = “age”) String age);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值