From f735dc090e99bbd273d4ea2c375be4f5309aa1b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=AD=8F=2C=E5=B0=8F=E9=AD=8F=2C=E6=88=91?= =?UTF-8?q?=E4=BB=AC=E8=A6=81=E5=8E=BB=E5=93=AA=E9=87=8C=E5=91=80?= Date: Thu, 2 Feb 2023 22:48:21 +0800 Subject: [PATCH] okhttp supports custom protocols. Optimize code --- .../FeignOkHttpConfigurationTests.java | 6 +- .../cloud/openfeign/protocol/Application.java | 79 ------------------- .../protocol/FeignOkProtocolsTests.java | 37 ++++++--- 3 files changed, 30 insertions(+), 92 deletions(-) delete mode 100644 spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java index 21ebb844..63fec903 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java @@ -17,8 +17,6 @@ package org.springframework.cloud.openfeign; import java.lang.reflect.Field; -import java.util.List; - import javax.net.ssl.HostnameVerifier; import okhttp3.OkHttpClient; @@ -76,10 +74,10 @@ class FeignOkHttpConfigurationTests { } @Test - void shouldProtocols() { + void shouldResolveProtocolFromProperties() { OkHttpClient httpClient = context.getBean(OkHttpClient.class); - assertThat(httpClient.protocols()).isEqualTo(List.of(Protocol.H2_PRIOR_KNOWLEDGE)); + assertThat(httpClient.protocols()).containsExactly(Protocol.H2_PRIOR_KNOWLEDGE); } protected Object getField(Object target, String name) { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java deleted file mode 100644 index 49fa84b3..00000000 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2013-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.openfeign.protocol; - -import jakarta.servlet.http.HttpServletRequest; - -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.cloud.client.DefaultServiceInstance; -import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; -import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; -import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; -import org.springframework.cloud.loadbalancer.support.ServiceInstanceListSuppliers; -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.cloud.openfeign.test.NoSecurityConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author changjin wei(魏昌进) - */ -public class Application { - - @FeignClient("localapp1") - protected interface ProtocolClient { - - @GetMapping("/protocol") - String getProtocol(); - - } - - @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration - @RestController - @EnableFeignClients(clients = { ProtocolClient.class }) - @LoadBalancerClients({ @LoadBalancerClient(name = "localapp1", configuration = LocalClientConfiguration.class) }) - @Import(NoSecurityConfiguration.class) - protected static class ProtocolController { - - @GetMapping("/protocol") - public String getProtocol(HttpServletRequest request) { - return request.getProtocol(); - } - - } - - @Configuration(proxyBeanMethods = false) - static class LocalClientConfiguration { - - @LocalServerPort - private int port = 0; - - @Bean - public ServiceInstanceListSupplier staticServiceInstanceListSupplier() { - return ServiceInstanceListSuppliers.from("local", - new DefaultServiceInstance("local-1", "local", "localhost", port, false)); - } - - } - -} diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java index 4848f087..625c1526 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java @@ -16,21 +16,31 @@ package org.springframework.cloud.openfeign.protocol; +import java.lang.reflect.Field; + import feign.Client; +import okhttp3.Protocol; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; +import org.springframework.cloud.openfeign.test.NoSecurityConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.test.annotation.DirtiesContext; +import org.springframework.util.ReflectionUtils; +import org.springframework.web.bind.annotation.RestController; import static org.assertj.core.api.Assertions.assertThat; /** * @author changjin wei(魏昌进) */ -@SpringBootTest(classes = Application.ProtocolController.class, webEnvironment = WebEnvironment.RANDOM_PORT, +@SpringBootTest(classes = FeignOkProtocolsTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=feignclienttest", "spring.cloud.openfeign.circuitbreaker.enabled=false", "spring.cloud.openfeign.httpclient.hc5.enabled=false", "spring.cloud.openfeign.okhttp.enabled=true", "spring.cloud.httpclientfactories.ok.enabled=true", "spring.cloud.loadbalancer.retry.enabled=false", @@ -41,21 +51,30 @@ class FeignOkProtocolsTests { @Autowired private Client feignClient; - @Autowired - private Application.ProtocolClient protocolClient; - @Test - void testFeignClientType() { + void shouldCreateCorrectFeignClientBeanWithProtocolFromProperties() { assertThat(feignClient).isInstanceOf(FeignBlockingLoadBalancerClient.class); FeignBlockingLoadBalancerClient client = (FeignBlockingLoadBalancerClient) feignClient; Client delegate = client.getDelegate(); assertThat(delegate).isInstanceOf(feign.okhttp.OkHttpClient.class); + okhttp3.OkHttpClient OkHttpClient = (okhttp3.OkHttpClient) getField(delegate, "delegate"); + assertThat(OkHttpClient.protocols()).containsExactly(Protocol.H2_PRIOR_KNOWLEDGE); + } - @Test - void shouldHttp2() { - String protocol = protocolClient.getProtocol(); - assertThat(protocol).isEqualTo("HTTP/2.0"); + protected Object getField(Object target, String name) { + Field field = ReflectionUtils.findField(target.getClass(), name); + ReflectionUtils.makeAccessible(field); + return ReflectionUtils.getField(field, target); + } + + @Configuration(proxyBeanMethods = false) + @EnableAutoConfiguration + @RestController + @LoadBalancerClients + @Import(NoSecurityConfiguration.class) + public static class Application { + } }