From f1cfadb736c8dee73244b026f3db3b90662bf310 Mon Sep 17 00:00:00 2001 From: duozhilin Date: Thu, 31 May 2018 18:32:45 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=8E=A7=E5=88=B6=E7=9A=84zookeeper=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{a => c}/BambooServiceAApplication.java | 0 .../{a => c}/web/rest/TestResource.java | 0 .../{b => d}/BambooServiceBApplication.java | 0 .../service/{b => d}/feign/TestClient.java | 0 .../service/{b => d}/rest/TestResource.java | 0 .../pom.xml | 40 +++++++++ .../service/c/BambooServiceCApplication.java | 34 ++++++++ .../service/c/web/rest/TestResource.java | 35 ++++++++ .../src/main/resources/config/application.yml | 15 ++++ .../pom.xml | 56 ++++++++++++ .../service/d/BambooServiceDApplication.java | 36 ++++++++ .../bamboo/service/d/feign/TestClient.java | 22 +++++ .../bamboo/service/d/rest/TestResource.java | 85 +++++++++++++++++++ .../src/main/resources/config/application.yml | 26 ++++++ .../pom.xml | 51 +++++++++++ .../bamboo/zuul/BambooZuulApplication.java | 38 +++++++++ .../src/main/resources/config/application.yml | 21 +++++ 17 files changed, 459 insertions(+) rename spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/{a => c}/BambooServiceAApplication.java (100%) rename spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/{a => c}/web/rest/TestResource.java (100%) rename spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/{b => d}/BambooServiceBApplication.java (100%) rename spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/{b => d}/feign/TestClient.java (100%) rename spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/{b => d}/rest/TestResource.java (100%) create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceCApplication.java create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/resources/config/application.yml create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceDApplication.java create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/resources/config/application.yml create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/java/cn/springcloud/bamboo/zuul/BambooZuulApplication.java create mode 100644 spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/resources/config/application.yml diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/a/BambooServiceAApplication.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceAApplication.java similarity index 100% rename from spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/a/BambooServiceAApplication.java rename to spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceAApplication.java diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/a/web/rest/TestResource.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java similarity index 100% rename from spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/a/web/rest/TestResource.java rename to spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/b/BambooServiceBApplication.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceBApplication.java similarity index 100% rename from spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/b/BambooServiceBApplication.java rename to spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceBApplication.java diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/b/feign/TestClient.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java similarity index 100% rename from spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/b/feign/TestClient.java rename to spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/b/rest/TestResource.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java similarity index 100% rename from spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/b/rest/TestResource.java rename to spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml new file mode 100644 index 00000000..67d08a12 --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml @@ -0,0 +1,40 @@ + + + + spring-cloud-mult-version-samples + cn.springcloud.gray + 1.0.2 + + 4.0.0 + + spring-cloud-bamboo-service-a-samples + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + + + org.springframework.cloud + spring-cloud-starter-eureka + + + + + + + + maven-deploy-plugin + + true + + + + + \ No newline at end of file diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceCApplication.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceCApplication.java new file mode 100644 index 00000000..8e68cd30 --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceCApplication.java @@ -0,0 +1,34 @@ +package cn.springcloud.bamboo.service.a; + +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.core.env.Environment; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +@SpringBootApplication +@EnableDiscoveryClient +public class BambooServiceCApplication { + + private static final org.slf4j.Logger log = LoggerFactory.getLogger(BambooServiceCApplication.class); + + + public static void main(String[] args) throws UnknownHostException { + Environment env = new SpringApplicationBuilder(BambooServiceCApplication.class).web(true).run(args).getEnvironment(); + log.info( + "\n----------------------------------------------------------\n\t" + + "Application '{}' is running! Access URLs:\n\t" + "Local: \t\thttp://127.0.0.1:{}\n\t" + + "External: \thttp://{}:{}\n----------------------------------------------------------", + env.getProperty("spring.application.name"), env.getProperty("server.port"), + InetAddress.getLocalHost().getHostAddress(), env.getProperty("server.port")); + + String configServerStatus = env.getProperty("configserver.status"); + log.info( + "\n----------------------------------------------------------\n\t" + + "Config Server: \t{}\n----------------------------------------------------------", + configServerStatus == null ? "Not found or not setup for this application" : configServerStatus); + } +} diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java new file mode 100644 index 00000000..66bf416a --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java @@ -0,0 +1,35 @@ +package cn.springcloud.bamboo.service.a.web.rest; + +import com.google.common.collect.ImmutableMap; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * Created by saleson on 2017/10/18. + */ +@RestController +@RequestMapping("/api/test") +public class TestResource { + @Autowired + Environment env; + + @RequestMapping(value = "/get", method = RequestMethod.GET) + @ResponseBody + public Map testGet(@RequestParam(value = "version", required = false) String version) { + return ImmutableMap.of("test", "success.", "version", StringUtils.defaultIfEmpty(version, ""), "serverPort", env.getProperty("server.port")); + } + + + @RequestMapping(value = "/post", method = RequestMethod.POST) + @ResponseBody + public Map testPost(@RequestParam(value = "version", required = false) String version, @RequestBody String body) { + return ImmutableMap.of( + "test", "success.", "version", StringUtils.defaultIfEmpty(version, ""), + "serverPort", env.getProperty("server.port"), "body", body); + } + +} diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/resources/config/application.yml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/resources/config/application.yml new file mode 100644 index 00000000..5508ad40 --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/resources/config/application.yml @@ -0,0 +1,15 @@ +spring: + application: + name: service-a +server: + port: 10101 +eureka: + client: + register-with-eureka: true + fetch-registry: true + serviceUrl: + defaultZone: http://localhost:10001/eureka/ + instance: + instanceId: ${spring.application.name}:${server.port} + metadata-map: + versions: 1,2 \ No newline at end of file diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml new file mode 100644 index 00000000..0e12d635 --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml @@ -0,0 +1,56 @@ + + + + spring-cloud-mult-version-samples + cn.springcloud.gray + 1.0.2 + + 4.0.0 + + spring-cloud-bamboo-service-b-samples + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + + + org.springframework.cloud + spring-cloud-starter-eureka + + + org.springframework.cloud + spring-cloud-starter-feign + + + + org.apache.commons + commons-lang3 + 3.5 + + + + cn.springcloud.gray + spring-cloud-starter-multi-version + + + + + + + + maven-deploy-plugin + + true + + + + + + \ No newline at end of file diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceDApplication.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceDApplication.java new file mode 100644 index 00000000..bbebceec --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceDApplication.java @@ -0,0 +1,36 @@ +package cn.springcloud.bamboo.service.b; + +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.netflix.feign.EnableFeignClients; +import org.springframework.core.env.Environment; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +@SpringBootApplication +@EnableDiscoveryClient +@EnableFeignClients +public class BambooServiceDApplication { + + private static final org.slf4j.Logger log = LoggerFactory.getLogger(BambooServiceDApplication.class); + + + public static void main(String[] args) throws UnknownHostException { + Environment env = new SpringApplicationBuilder(BambooServiceDApplication.class).web(true).run(args).getEnvironment(); + log.info( + "\n----------------------------------------------------------\n\t" + + "Application '{}' is running! Access URLs:\n\t" + "Local: \t\thttp://127.0.0.1:{}\n\t" + + "External: \thttp://{}:{}\n----------------------------------------------------------", + env.getProperty("spring.application.name"), env.getProperty("server.port"), + InetAddress.getLocalHost().getHostAddress(), env.getProperty("server.port")); + + String configServerStatus = env.getProperty("configserver.status"); + log.info( + "\n----------------------------------------------------------\n\t" + + "Config Server: \t{}\n----------------------------------------------------------", + configServerStatus == null ? "Not found or not setup for this application" : configServerStatus); + } +} diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java new file mode 100644 index 00000000..468f5ed6 --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java @@ -0,0 +1,22 @@ +package cn.springcloud.bamboo.service.b.feign; + +import org.springframework.cloud.netflix.feign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * Created by saleson on 2017/11/10. + */ +@FeignClient(name = "service-a") +public interface TestClient { + + @RequestMapping(path = "/api/test/get", method = RequestMethod.GET) + Map testGet(@RequestParam(value = "version", required = false) String version); + + + + @RequestMapping(value = "/api/test/post", method = RequestMethod.POST) + Map testPost(@RequestParam(value = "version") String version, @RequestBody String body); + +} diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java new file mode 100644 index 00000000..0f5b1654 --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java @@ -0,0 +1,85 @@ +package cn.springcloud.bamboo.service.b.rest; + +import cn.springcloud.bamboo.service.b.feign.TestClient; +import com.google.common.collect.ImmutableMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * Created by saleson on 2017/10/18. + */ +@RestController +@RequestMapping("/api/test") +public class TestResource { + @Autowired + private RestTemplate restTemplate; + @Autowired + private TestClient testClient; + + /** + * test rest template invoke service-a + * + * @param request HttpServletRequest + * @return 消息体 + */ + @RequestMapping(value = "/restTemplateGet", method = RequestMethod.GET) + @ResponseBody + public Map restTemplateGet(HttpServletRequest request) { + String url = "http://service-a/api/test/get"; + String query = request.getQueryString(); + if (!StringUtils.isEmpty(query)) { + url = url + "?" + query; + } + + Map map = restTemplate.getForObject(url, Map.class); + return ImmutableMap.of("restTemplateGet", "success.", "service-a-result", map); + } + + + /** + * test feign invoke service-a + * + * @param version 请求版本 + * @return 消息体 + */ + @RequestMapping(value = "/feignPost", method = RequestMethod.POST) + @ResponseBody + public Map feignPost(@RequestParam(value = "version", required = false) String version, @RequestBody String body) { + Map map = testClient.testPost(version, body); + return ImmutableMap.of("feignPost", "success.", "service-a-result", map); + } + + + /** + * test feign invoke service-a + * + * @param version 请求版本 + * @return 消息体 + */ + @RequestMapping(value = "/restTemplatePost", method = RequestMethod.POST) + @ResponseBody + public Map restTemplatePost(@RequestParam(value = "version", required = false) String version, @RequestBody String body) { + String url = "http://service-a/api/test/post?version="+version; + Map map = restTemplate.postForObject(url, body, Map.class); + return ImmutableMap.of("restTemplatePost", "success.", "service-a-result", map); + } + + + /** + * test feign invoke service-a + * + * @param version 请求版本 + * @return 消息体 + */ + @RequestMapping(value = "/feignGet", method = RequestMethod.GET) + @ResponseBody + public Map feignGet(@RequestParam(value = "version", required = false) String version) { + Map map = testClient.testGet(version); + return ImmutableMap.of("feignGet", "success.", "service-a-result", map); + } +} diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/resources/config/application.yml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/resources/config/application.yml new file mode 100644 index 00000000..efd7e131 --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/resources/config/application.yml @@ -0,0 +1,26 @@ +spring: + application: + name: service-b +server: + port: 10102 +eureka: + client: + register-with-eureka: true + fetch-registry: true + serviceUrl: + defaultZone: http://localhost:10001/eureka/ + instance: + instanceId: ${spring.application.name}:${server.port} + +feign: + hystrix: + enabled: true + +hystrix: + command: + default: + execution: + isolation: + strategy: THREAD + thread: + timeoutInMilliseconds: 5000 \ No newline at end of file diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml new file mode 100644 index 00000000..d03eb22f --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml @@ -0,0 +1,51 @@ + + + + spring-cloud-mult-version-samples + cn.springcloud.gray + 1.0.2 + + 4.0.0 + + spring-cloud-bamboo-zuul-samples + + + + + org.springframework.cloud + spring-cloud-starter-zuul + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + + + org.springframework.cloud + spring-cloud-starter-eureka + + + cn.springcloud.gray + spring-cloud-starter-multi-version + + + + + + + + + maven-deploy-plugin + + true + + + + + + \ No newline at end of file diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/java/cn/springcloud/bamboo/zuul/BambooZuulApplication.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/java/cn/springcloud/bamboo/zuul/BambooZuulApplication.java new file mode 100644 index 00000000..81cbd735 --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/java/cn/springcloud/bamboo/zuul/BambooZuulApplication.java @@ -0,0 +1,38 @@ +package cn.springcloud.bamboo.zuul; + +import org.slf4j.LoggerFactory; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.client.SpringCloudApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.netflix.zuul.EnableZuulProxy; +import org.springframework.core.env.Environment; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * Created by saleson on 2017/10/18. + */ +@SpringCloudApplication +@EnableZuulProxy +@EnableDiscoveryClient +public class BambooZuulApplication { + private static final org.slf4j.Logger log = LoggerFactory.getLogger(BambooZuulApplication.class); + + + public static void main(String[] args) throws UnknownHostException { + Environment env = new SpringApplicationBuilder(BambooZuulApplication.class).web(true).run(args).getEnvironment(); + log.info( + "\n----------------------------------------------------------\n\t" + + "Application '{}' is running! Access URLs:\n\t" + "Local: \t\thttp://127.0.0.1:{}\n\t" + + "External: \thttp://{}:{}\n----------------------------------------------------------", + env.getProperty("spring.application.name"), env.getProperty("server.port"), + InetAddress.getLocalHost().getHostAddress(), env.getProperty("server.port")); + + String configServerStatus = env.getProperty("configserver.status"); + log.info( + "\n----------------------------------------------------------\n\t" + + "Config Server: \t{}\n----------------------------------------------------------", + configServerStatus == null ? "Not found or not setup for this application" : configServerStatus); + } +} diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/resources/config/application.yml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/resources/config/application.yml new file mode 100644 index 00000000..a9998f06 --- /dev/null +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/resources/config/application.yml @@ -0,0 +1,21 @@ +spring: + application: + name: api-gateway +server: + port: 10301 +eureka: + client: + serviceUrl: + defaultZone: http://localhost:10001/eureka/ + +ribbon: +# ReadTimeout: 30000 +# ConnectTimeout: 30000 + eureka: + enabled: true +zuul: + prefix: /gateway #为zuul设置一个公共的前缀 +# routes: +# eureka-client: #随便定义,当不存在serviceId时,默认该值为serviceId(就是注册服务的名称,属性spring.application.name) +# path: /client/** #匹配/techouse/usersystem/** 均路由到cloud-client +# serviceId: eureka-client #指定路由到的serviceId \ No newline at end of file From e0cef9bf53e37a09e56ba367e134790d326a5ea8 Mon Sep 17 00:00:00 2001 From: duozhilin Date: Thu, 31 May 2018 18:32:54 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=8E=A7=E5=88=B6=E7=9A=84zookeeper=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + spring-cloud-mult-version-samples/pom.xml | 3 +++ .../service/c/BambooServiceAApplication.java | 2 +- .../service/c/web/rest/TestResource.java | 2 +- .../service/d/BambooServiceBApplication.java | 2 +- .../bamboo/service/d/feign/TestClient.java | 2 +- .../bamboo/service/d/rest/TestResource.java | 4 ++-- .../pom.xml | 4 ++-- .../service/c/BambooServiceCApplication.java | 2 +- .../service/c/web/rest/TestResource.java | 2 +- .../src/main/resources/config/application.yml | 23 +++++++++--------- .../pom.xml | 4 ++-- .../service/d/BambooServiceDApplication.java | 2 +- .../bamboo/service/d/feign/TestClient.java | 4 ++-- .../bamboo/service/d/rest/TestResource.java | 24 +++++++++---------- .../src/main/resources/config/application.yml | 16 ++++++------- .../pom.xml | 4 ++-- .../src/main/resources/config/application.yml | 16 +++++++------ 18 files changed, 60 insertions(+), 57 deletions(-) diff --git a/.gitignore b/.gitignore index 5f75a768..f624d549 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ ###################### /target/www/** /notes/** +**/target/ ###################### # Node diff --git a/spring-cloud-mult-version-samples/pom.xml b/spring-cloud-mult-version-samples/pom.xml index 6b8b51ee..973a490e 100644 --- a/spring-cloud-mult-version-samples/pom.xml +++ b/spring-cloud-mult-version-samples/pom.xml @@ -14,8 +14,11 @@ spring-cloud-bamboo-eureka-samples spring-cloud-bamboo-zuul-samples + spring-cloud-bamboo-zuul-zookeeper-samples spring-cloud-bamboo-service-a-samples spring-cloud-bamboo-service-b-samples + spring-cloud-bamboo-service-c-samples + spring-cloud-bamboo-service-d-samples diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceAApplication.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceAApplication.java index e6451bbe..6ce4f873 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceAApplication.java +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceAApplication.java @@ -1,4 +1,4 @@ -package cn.springcloud.bamboo.service.a; +package cn.springcloud.bamboo.service.c; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java index 66bf416a..8db7bd7c 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-a-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java @@ -1,4 +1,4 @@ -package cn.springcloud.bamboo.service.a.web.rest; +package cn.springcloud.bamboo.service.c.web.rest; import com.google.common.collect.ImmutableMap; import org.apache.commons.lang.StringUtils; diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceBApplication.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceBApplication.java index dace06f6..3bf5d609 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceBApplication.java +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceBApplication.java @@ -1,4 +1,4 @@ -package cn.springcloud.bamboo.service.b; +package cn.springcloud.bamboo.service.d; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java index 468f5ed6..6e2502ae 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java @@ -1,4 +1,4 @@ -package cn.springcloud.bamboo.service.b.feign; +package cn.springcloud.bamboo.service.d.feign; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.*; diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java index 0f5b1654..ed517cad 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-b-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java @@ -1,6 +1,6 @@ -package cn.springcloud.bamboo.service.b.rest; +package cn.springcloud.bamboo.service.d.rest; -import cn.springcloud.bamboo.service.b.feign.TestClient; +import cn.springcloud.bamboo.service.d.feign.TestClient; import com.google.common.collect.ImmutableMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml index 67d08a12..a701b2d0 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - spring-cloud-bamboo-service-a-samples + spring-cloud-bamboo-service-c-samples @@ -22,7 +22,7 @@ org.springframework.cloud - spring-cloud-starter-eureka + spring-cloud-starter-zookeeper-discovery diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceCApplication.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceCApplication.java index 8e68cd30..9e010db0 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceCApplication.java +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/BambooServiceCApplication.java @@ -1,4 +1,4 @@ -package cn.springcloud.bamboo.service.a; +package cn.springcloud.bamboo.service.c; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java index 66bf416a..8db7bd7c 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/java/cn/springcloud/bamboo/service/c/web/rest/TestResource.java @@ -1,4 +1,4 @@ -package cn.springcloud.bamboo.service.a.web.rest; +package cn.springcloud.bamboo.service.c.web.rest; import com.google.common.collect.ImmutableMap; import org.apache.commons.lang.StringUtils; diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/resources/config/application.yml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/resources/config/application.yml index 5508ad40..0e20155e 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/resources/config/application.yml +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-c-samples/src/main/resources/config/application.yml @@ -1,15 +1,14 @@ spring: application: - name: service-a + name: service-c + cloud: + zookeeper: + connect-string: 127.0.0.1:2181 + discovery: + register: true + root: dev + metadata: + versions: 1,2 + server: - port: 10101 -eureka: - client: - register-with-eureka: true - fetch-registry: true - serviceUrl: - defaultZone: http://localhost:10001/eureka/ - instance: - instanceId: ${spring.application.name}:${server.port} - metadata-map: - versions: 1,2 \ No newline at end of file + port: 10101 \ No newline at end of file diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml index 0e12d635..62229ead 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - spring-cloud-bamboo-service-b-samples + spring-cloud-bamboo-service-d-samples @@ -22,7 +22,7 @@ org.springframework.cloud - spring-cloud-starter-eureka + spring-cloud-starter-zookeeper-discovery org.springframework.cloud diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceDApplication.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceDApplication.java index bbebceec..981701eb 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceDApplication.java +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/BambooServiceDApplication.java @@ -1,4 +1,4 @@ -package cn.springcloud.bamboo.service.b; +package cn.springcloud.bamboo.service.d; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java index 468f5ed6..7687e610 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/feign/TestClient.java @@ -1,4 +1,4 @@ -package cn.springcloud.bamboo.service.b.feign; +package cn.springcloud.bamboo.service.d.feign; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -8,7 +8,7 @@ /** * Created by saleson on 2017/11/10. */ -@FeignClient(name = "service-a") +@FeignClient(name = "service-c") public interface TestClient { @RequestMapping(path = "/api/test/get", method = RequestMethod.GET) diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java index 0f5b1654..3909f89f 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/java/cn/springcloud/bamboo/service/d/rest/TestResource.java @@ -1,6 +1,6 @@ -package cn.springcloud.bamboo.service.b.rest; +package cn.springcloud.bamboo.service.d.rest; -import cn.springcloud.bamboo.service.b.feign.TestClient; +import cn.springcloud.bamboo.service.d.feign.TestClient; import com.google.common.collect.ImmutableMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; @@ -22,7 +22,7 @@ public class TestResource { private TestClient testClient; /** - * test rest template invoke service-a + * test rest template invoke service-c * * @param request HttpServletRequest * @return 消息体 @@ -30,19 +30,19 @@ public class TestResource { @RequestMapping(value = "/restTemplateGet", method = RequestMethod.GET) @ResponseBody public Map restTemplateGet(HttpServletRequest request) { - String url = "http://service-a/api/test/get"; + String url = "http://service-c/api/test/get"; String query = request.getQueryString(); if (!StringUtils.isEmpty(query)) { url = url + "?" + query; } Map map = restTemplate.getForObject(url, Map.class); - return ImmutableMap.of("restTemplateGet", "success.", "service-a-result", map); + return ImmutableMap.of("restTemplateGet", "success.", "service-c-result", map); } /** - * test feign invoke service-a + * test feign invoke service-c * * @param version 请求版本 * @return 消息体 @@ -51,12 +51,12 @@ public Map restTemplateGet(HttpServletRequest request) { @ResponseBody public Map feignPost(@RequestParam(value = "version", required = false) String version, @RequestBody String body) { Map map = testClient.testPost(version, body); - return ImmutableMap.of("feignPost", "success.", "service-a-result", map); + return ImmutableMap.of("feignPost", "success.", "service-c-result", map); } /** - * test feign invoke service-a + * test feign invoke service-c * * @param version 请求版本 * @return 消息体 @@ -64,14 +64,14 @@ public Map feignPost(@RequestParam(value = "version", required = @RequestMapping(value = "/restTemplatePost", method = RequestMethod.POST) @ResponseBody public Map restTemplatePost(@RequestParam(value = "version", required = false) String version, @RequestBody String body) { - String url = "http://service-a/api/test/post?version="+version; + String url = "http://service-c/api/test/post?version="+version; Map map = restTemplate.postForObject(url, body, Map.class); - return ImmutableMap.of("restTemplatePost", "success.", "service-a-result", map); + return ImmutableMap.of("restTemplatePost", "success.", "service-c-result", map); } /** - * test feign invoke service-a + * test feign invoke service-c * * @param version 请求版本 * @return 消息体 @@ -80,6 +80,6 @@ public Map restTemplatePost(@RequestParam(value = "version", req @ResponseBody public Map feignGet(@RequestParam(value = "version", required = false) String version) { Map map = testClient.testGet(version); - return ImmutableMap.of("feignGet", "success.", "service-a-result", map); + return ImmutableMap.of("feignGet", "success.", "service-c-result", map); } } diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/resources/config/application.yml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/resources/config/application.yml index efd7e131..3c299552 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/resources/config/application.yml +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-service-d-samples/src/main/resources/config/application.yml @@ -1,16 +1,14 @@ spring: application: - name: service-b + name: service-d + cloud: + zookeeper: + connect-string: 127.0.0.1:2181 + discovery: + register: true + root: dev server: port: 10102 -eureka: - client: - register-with-eureka: true - fetch-registry: true - serviceUrl: - defaultZone: http://localhost:10001/eureka/ - instance: - instanceId: ${spring.application.name}:${server.port} feign: hystrix: diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml index d03eb22f..f28d6846 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - spring-cloud-bamboo-zuul-samples + spring-cloud-bamboo-zuul-zookeeper-samples @@ -27,7 +27,7 @@ org.springframework.cloud - spring-cloud-starter-eureka + spring-cloud-starter-zookeeper-discovery cn.springcloud.gray diff --git a/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/resources/config/application.yml b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/resources/config/application.yml index a9998f06..b5b1ddfc 100644 --- a/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/resources/config/application.yml +++ b/spring-cloud-mult-version-samples/spring-cloud-bamboo-zuul-zookeeper-samples/src/main/resources/config/application.yml @@ -1,18 +1,20 @@ spring: application: name: api-gateway + cloud: + zookeeper: + connect-string: 127.0.0.1:2181 + discovery: + register: true + root: dev server: port: 10301 -eureka: - client: - serviceUrl: - defaultZone: http://localhost:10001/eureka/ -ribbon: +#ribbon: # ReadTimeout: 30000 # ConnectTimeout: 30000 - eureka: - enabled: true +# eureka: +# enabled: true zuul: prefix: /gateway #为zuul设置一个公共的前缀 # routes: From 1cdda8dc1eedd840c3cf7708a5c0e6cc97f21c75 Mon Sep 17 00:00:00 2001 From: duozhilin Date: Fri, 1 Jun 2018 09:16:36 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=94=AF=E6=8C=81=E4=BE=8B=E5=AD=90=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E4=BD=BF=E7=94=A8zookeeper=E7=9A=84=E8=AF=B4?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-cloud-mult-version-samples/README.md | 25 ++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/spring-cloud-mult-version-samples/README.md b/spring-cloud-mult-version-samples/README.md index d5a2425a..d904dadd 100644 --- a/spring-cloud-mult-version-samples/README.md +++ b/spring-cloud-mult-version-samples/README.md @@ -3,6 +3,7 @@ 在使用多版本控制时,需要修改服务提供方和服务消费方,分别是application.yaml和pom.xml。 1、在服务提供方的application.yaml中添加versions属性,标明服务支持哪些版本。 +* eureka ```yaml spring: application: @@ -20,8 +21,24 @@ eureka: metadata-map: versions: 1,2 ``` +* zookeeper +```yaml +spring: + application: + name: service-c + cloud: + zookeeper: + connect-string: 127.0.0.1:2181 + discovery: + register: true + root: dev + metadata: + versions: 1,2 +server: + port: 10101 +``` -2、在服务消费方,只需要在pom.xml添加spring-cloud-starter-multi-version到pom.xml依赖中即可 +2、在服务消费方,只需要在pom.xml添加spring-cloud-starter-multi-version到pom.xml依赖中即可,eureka和zookeeper的依赖二选一。 ```xml @@ -32,10 +49,16 @@ eureka: org.springframework.boot spring-boot-starter-test + org.springframework.cloud spring-cloud-starter-eureka + + + org.springframework.cloud + spring-cloud-starter-zookeeper-discovery + org.springframework.cloud spring-cloud-starter-feign