1.启动多个端口号服务
修改yml文件内的端口号,则可启动多个tomcat
2.负载均衡实现
2.1初级实现负载均衡
- 注入LoadBalancerClient接口的依赖
- LoadBalancerClient的对象负责从nacos服务中发现和获取服务实例
- RibbonLoadBalancerClient为实现类,spring启动时会先去创建这个类的bean对象
Controller层实现代码
/*此对象负责从nacos服务中发现和获取服务实例*/
@Autowired
private LoadBalancerClient loadBalancerClient;//RibbonLoadBalancerClient实现类
// spring启动时会先去创建这个类的bean对象
/*在doRestEcho1基础上实现了负载均衡*/
@GetMapping("/concumer/doRestEcho2")
public String doRestEcho2(){
//获取provider服务实例 sca-provider为服务名
ServiceInstance serviceInstance=loadBalancerClient.choose("sca-provider");
String url=String.format("http://%s:%s/provider/echo/%s", serviceInstance.getHost(),
serviceInstance.getPort(),appName);
System.out.println(url);
return restTemplate.getForObject(url,String.class);
}
2.2 使用@LoadBalanced实现负载均衡
原理:发起远程调用时,底层会对这个请求进行拦截,会基于LoadBalancerClient对象获取服务实例,然后进行负载均衡方式的调用
启动类代码
@Bean
@LoadBalanced
public RestTemplate loadBalancedRestTemplate(){
return new RestTemplate();
}
Controller层代码
@Autowired
private RestTemplate loadBalancedRestTemplate;
@GetMapping("/concumer/doRestEcho3")
public String doRestEcho3(){
// String url="http://sca-provider/provider/echo/"+appName;
String url=String.format("http://%s/provider/echo/%s","sca-provider",appName);
return loadBalancedRestTemplate.getForObject(url, String.class);
}
总结:
- 1.此方法简化了基于loadBalancerClient获取服务实例信息的过程
- 2.如何简化?为RestTemplate注入拦截器(SpringMVC中的拦截器),在底层拦截器中实现服务实例的获取
- 3.如何为RestTemplate对象注入拦截器?RestTemplate对象构建时,使用@LoadBalanced注解进行描述
3.Feign
3.1概念
- Feign 是一种声明式Web服务客户端,底层封装了对Rest技术的应用,通过Feign可以简化服务消费方对远程服务提供方法的调用实现
3.2 使用Feign步骤
3.2.1 导入依赖
<!--添加openfeign的依赖 封装了远程服务调用方式 以及错误处理机制-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3.2.2 添加@EnableFeignClients注解
- 位置:启动类上
- 作用:告诉Spring框架对使用@FeignClient注解描述的接口创建实现类以及对象
3.2.3 创建接口RemoteProviderService
实现代码
package com.jt.concumer.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/*@FeignClient描述的接口,用于定义远程调用规范
* 其中name属性的值为远端服务名 同时也会把这个名字作为RemoveProviderService接口实现类Bean对象名字*/
@FeignClient(name="sca-provider")/*value也可以*/
public interface RemoteProviderService {
@GetMapping("/provider/echo/{msg}")
String echoMsg(@PathVariable("msg") String msg);
}
- 问题:接口的方法上为什么要写@GetMapping?
- Feign接口是基于方法上@GetMapping…注解中的value属性值来定义远程调用规范,后续会基于value值来调用远端服务的具体方法
3.2.4创建FeignConsumerController类
实现代码
package com.jt.concumer.controller;
import com.jt.concumer.service.RemoteProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/concumer")
public class FeignConsumerController {
@Autowired
private RemoteProviderService remoteProviderService;
/**基于feign方式的服务调用 通过ribbon实现负载均衡
* 外界:http://localhost:8090/concumer/echo/aaa
* */
@GetMapping("/echo/{msg}")
public String doFeignEcho(@PathVariable String msg){
//基于feign方式进行远端服务调用(前提是服务必须存在)
return remoteProviderService.echoMsg(msg);
}
}
总结
- 1.RestTemplate类的作用:通过此对象调用远端服务
- 2.LoadBalancerClient作用:此对象负责从nacos服务中发现和获取服务实例
- 3.@LoadBalanced作用:使用@LoadBalanced注解描述RestTemplate对象时, 发起远程调用时,底层会对这个请求进行拦截,会基于LoadBalancerClient对象获取服务实例,然后进行负载均衡方式的调用
- 4.@EnableFeignClients作用:告诉Spring框架,要对使用@FeignClient注解描述的接口创建实现类以及对象
- 5.@FeignClient作用:@FeignClient描述的接口,用于定义远程调用规范,其中name属性的值为远端服务名 同时也会把这个名字作为RemoveProviderService接口实现类Bean对象名字