修改yml文件内的端口号,则可启动多个tomcat
/*此对象负责从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);
}
原理:发起远程调用时,底层会对这个请求进行拦截,会基于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);
}
总结:
<!--添加openfeign的依赖 封装了远程服务调用方式 以及错误处理机制-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
实现代码
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值来调用远端服务的具体方法
实现代码
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);
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_55740233/article/details/120903040
内容来源于网络,如有侵权,请联系作者删除!