我是靠谱客的博主 生动钢笔,最近开发中收集的这篇文章主要介绍4. restTemplate和ribbon和feign(2刷),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. RestTemplate

pom

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
		</dependency>

配置

@Configuration
public class RibbonConfig {

    /**
     * 在此类中为IoC 容器中注入一个RestTemplate 的Bean , 并在这个Bean 上加上@LoadBalanced 注解,此时RestTemplate 就结合了
     * Ribbon 开启了负载均衡功能。
     * @return
     */
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

最简单的调用测试

  • 此测试,无需上面的 引用和配置
@RestController
public class RestTestController {

    @GetMapping("/testRest")
    public String testRest(){
        RestTemplate restTemplate=new RestTemplate();
        return restTemplate.getForObject("https://www.baidu.com/",String.class);
    }
}

编写service调用 其他项目

@Service
public class RibbonService {

    @Autowired
    RestTemplate restTemplate;

    /**
     * 在该类的hi()方法用restTemplate调用eureka-client的API接口  Uri 上不需要使用硬编码(比如IP),只需要写服务名eureka-client即可
     * 程序会根据服务名称 eureka-client到Eureka-server注册中心去自动获取IP和端口信息。
     * @param name
     * @return
     */
    public String hi(String name) {
        return restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class);
    }
}
	//最终调用的是 这个接口:
    @Value("${server.port}")
    String port;
    @GetMapping("/hi")
    public String home(@RequestParam String name) {
        return "hi "+name+",i am from port:" +port;
    }

编写action 调用 service

@RestController
public class RibbonController {

    /**
     * 写一个"/hi" Get 方法的接口,调用RibbonService 类的hi()方法
     */
    @Autowired
    RibbonService ribbonService;
    
    @GetMapping("/hi")
    public String hi(@RequestParam(required = false,defaultValue = "forezp") String name){
        return ribbonService.hi(name);
    }

    //loadBalancer 注入
    @Autowired
    private LoadBalancerClient loadBalancer;

    /**
     * 通过LoadBalancerClient 去选择一个eureka-client 的服务实例的信息, 并将该信息返回
     * 
     */
    @GetMapping("/testRibbon")
    public String  testRibbon() {
        ServiceInstance instance = loadBalancer.choose("eureka-client");
      //  URI uri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
        //结果为:localhost:8762
        return instance.getHost()+":"+instance.getPort();
    }
}
  • idea开启并行执行
  • 把eureka-client 在启动一个 8763的。会执行负载均衡

2. 声明式调用 Feign

pom 和 开启feign

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>

			<version>2.0.0.RELEASE</version> #失败的话,引用一个版本
@EnableFeignClients

使用feign调用 远程项目

主方法

/**
 * 在接口上加@FeignClient 注解来声明一个Feign Client,其中value 为远程调用其他服务的服务名, FeignConfig.class 为Feign Client 的配置类
 *
 */
@FeignClient(value = "eureka-client") //,fallback = EurekaClientHystrix.class
public interface EurekaClientFeign {

    /**
     * 在EurekaClientFeign 接口内部有一个sayHiFromClientEureka()方法,该方法通过Feign 来调用eureka-client 服务的“/hi”的API 接口
     * @param name
     * @return
     */
    @GetMapping(value = "/hi")
    String sayHiFromClientEureka(@RequestParam(value = "name") String name);
}

回退的方法

feign:
  hystrix:
    enabled: true #必须配置
@Component
public class EurekaClientHystrix implements EurekaClientFeign{

    @Override
    public String sayHiFromClientEureka(String name) {
        return "进入Hystrix了";
    }
}

远程调用失败,会重试的配置

@FeignClient(value = "eureka-client", configuration = FeignConfig.class)


@Configuration // 必须标明为配置类
public class FeignConfig {

    /**
     * 在该类中注入Retryer的Bean ,覆盖掉默认的Retryer的Bean,从而达到自定义配置的目的。
     * 例如Feign 默认的配置在请求失败后, 重试次数为0 ,即不重试( Retry er.NEVER_RETRY )。
     * 更改为 FeignClient请求失败后重试测试: 重试间隔为100毫秒,最大重试时间为1秒,重试次数5次。
     * @return
     */
    @Bean
    public Retryer feignRetryer() {
        return new Retryer.Default(100, SECONDS.toMillis(1), 5);
    } //不管怎么设置,都是重试 2次

}

controller 编写

@RestController
public class HiController {
    @Autowired
    HiService hiService;

    @GetMapping("/hi")
    public String sayHi(@RequestParam( defaultValue = "forezp",required = false)String name){
        return hiService.sayHi(name);
    }
}

在feign使用 httpclient 或 okhttp

feign默认是HttpURLConnection进行http请求发送

yaml配置

# 如何不想feign 使用默认的HttpURLConnection 使用httpclient 需要设置下面的属性
feign:
  hystrix:
    enabled: true
  httpclient:
    enabled: true
  okhttp:
    enabled: false

logging: ## Spring Cloud Gateway的日志配置
  level:
    com.forezp.client.EurekaClientFeign: DEBUG
  config: classpath:logback.xml

xml配置

		<!-- porn 文件加上apache-httpclient 的依赖, Feign 就会采用HttpClient 作为网络请求 框架,而不是默认的HttpURLConnection
		-->

		<dependency>
			<groupId>io.github.openfeign</groupId>
			<artifactId>feign-httpclient</artifactId>
			<version>9.4.0</version>
		</dependency>


		<!-- 同理,如果想要Feign 中使用Okhttp作为网络请求框架,则只需要在porn 文件上加上feign-okhttp 的依赖 feign-httpclient和feign-okhttp只要 使用一种-->
		<dependency>
  			<groupId>com.netflix.feign</groupId>
  			<artifactId>feign-okhttp</artifactId>
  			<version>8.18.0</version>
		</dependency>
		

最后

以上就是生动钢笔为你收集整理的4. restTemplate和ribbon和feign(2刷)的全部内容,希望文章能够帮你解决4. restTemplate和ribbon和feign(2刷)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部