diff --git a/maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/ElevatorApplication.java b/maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/ElevatorApplication.java index 95d339f7..7f14df4d 100644 --- a/maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/ElevatorApplication.java +++ b/maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/elevator/ElevatorApplication.java @@ -1,15 +1,20 @@ package cn.cloudwalk.elevator; import cn.cloudwalk.event.EnableCloudwalkEvent; +import cn.cloudwalk.ribbon.NincaCrkStdRibbonConfiguration; import com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cloud.netflix.feign.EnableFeignClients; +import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.scheduling.annotation.EnableAsync; +/** Ribbon 名称需与 {@code feign.ninca-crk-std.name} 及 Feign Client 一致。 */ +@RibbonClient(name = "${feign.ninca-crk-std.name:ninca-crk-std}", + configuration = NincaCrkStdRibbonConfiguration.class) @EnableCloudwalkEvent @EnableAsync @EnableCaching diff --git a/maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/NincaCrkStdRibbonConfiguration.java b/maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/NincaCrkStdRibbonConfiguration.java new file mode 100644 index 00000000..b8df08be --- /dev/null +++ b/maven-cw-elevator-application/cw-elevator-application-starter/src/main/java/cn/cloudwalk/ribbon/NincaCrkStdRibbonConfiguration.java @@ -0,0 +1,23 @@ +package cn.cloudwalk.ribbon; + +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.ConfigurationBasedServerList; +import com.netflix.loadbalancer.Server; +import com.netflix.loadbalancer.ServerList; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 为 Feign 客户端 {@code ninca-crk-std} 强制使用配置型 ServerList,避免 Consul 发现返回空列表时覆盖 + * {@code ninca-crk-std.ribbon.listOfServers}(Edgware 下常见「Load balancer does not have available server」)。 + */ +@Configuration +public class NincaCrkStdRibbonConfiguration { + + @Bean + public ServerList ribbonServerList(IClientConfig config) { + ConfigurationBasedServerList list = new ConfigurationBasedServerList(); + list.initWithNiwsConfig(config); + return list; + } +} diff --git a/maven-cw-elevator-application/deploy/README.md b/maven-cw-elevator-application/deploy/README.md index a25b7d8c..70f2e29d 100644 --- a/maven-cw-elevator-application/deploy/README.md +++ b/maven-cw-elevator-application/deploy/README.md @@ -39,10 +39,14 @@ cd v2-maven && ./run.sh ## Consul(`192.168.3.12` Docker) -本仓库在 **`v1-legacy/bootstrap.properties`**、**`v2-maven/bootstrap.properties`** 中写入: +本仓库在 **`v1-legacy/bootstrap.properties`**、**`v2-maven/bootstrap.properties`** 中写入,并与 **V1 运行包 `bootstrap.properties` 中 Consul 段**对齐: - `spring.cloud.consul.host=192.168.3.12` - `spring.cloud.consul.port=8500` +- `spring.cloud.consul.enabled=true` +- `spring.cloud.consul.discovery.register=true` +- **`spring.cloud.consul.discovery.enabled=false`**(与 V1 一致:不作为 Consul **客户端**做服务发现) +- `spring.profiles.active=access-control`(与 V1 一致) 用于覆盖 fat-jar 内 **`10.128.161.95:8500`**,与 **`deploy/consul-docker`**(`hashicorp/consul:1.22`)对齐。在同一目录执行 `./run.sh` 时,Spring Cloud 会加载上述 **`bootstrap.properties`**。 @@ -50,11 +54,9 @@ cd v2-maven && ./run.sh **说明**:jar 内 **Dubbo / ZooKeeper** 仍可能指向旧 IP(如 `10.128.161.95:2181`);若启动报 ZK 连接失败,需在 **`application.properties`** 中另行改 Dubbo 注册中心(本次仅处理 Consul)。 -### Feign `ninca-crk-std`(Ribbon / Consul) +### Feign `ninca-crk-std`(Ribbon) -若日志出现 **`Load balancer does not have available server for client: ninca-crk-std`**,表示 **Consul 里没有名为 `ninca-crk-std` 的注册实例**,而 Feign 默认用 **Consul 服务发现**拉实例列表。 - -**做法**:① 在目标环境启动 **`ninca-crk-std`(访客标准服务)** 并注册到同一 Consul;或 ② 在 **`application.properties`** 中使用 **Ribbon 静态列表**(已增加 `ninca-crk-std.ribbon.NIWSServerListClassName` 与 `listOfServers`,默认与 `ninca-crk-std.ip` 一致),把 **`listOfServers`** 改成你实际可访问的 **`主机:端口`**。 +在 **`spring.cloud.consul.discovery.enabled=false`**(与 V1 对齐)时,不从 Consul 拉 **`ninca-crk-std`** 实例,需在 **`application.properties`** 中配置 **Ribbon 静态列表**(`ninca-crk-std.ribbon.*` 与 `ninca-crk-std.ip`),按环境改成可访问的 **`主机:端口`**。Maven 构建的 `cw-elevator-application-2.0.0.jar` 另含 `NincaCrkStdRibbonConfiguration`,避免 Edgware 下静态列表被忽略。 ## Redis 与 `SPRING_APPLICATION_JSON` diff --git a/maven-cw-elevator-application/deploy/v1-legacy/application.properties b/maven-cw-elevator-application/deploy/v1-legacy/application.properties index 4465f9b3..5f2757c4 100644 --- a/maven-cw-elevator-application/deploy/v1-legacy/application.properties +++ b/maven-cw-elevator-application/deploy/v1-legacy/application.properties @@ -1,5 +1,6 @@ # deploy/v1-legacy \uFF1A\u5386\u53F2\u5305 cw-elevator-application-V1.0.0.20211103.jar\uFF08\u540C\u76EE\u5F55\u542F\u52A8\uFF09 server.port=18080 +server.tomcat.uri-encoding=UTF-8 spring.application.name=elevator-app # OpenFeign 2.1.x\uFF1A\u591A\u4E2A @FeignClient \u5171\u540C name \u5360\u4F4D\u7B26\u65F6\u91CD\u590D\u6CE8\u518C FeignClientSpecification\uFF0C\u4E0E Spring \u9519\u8BEF\u63D0\u793A\u4E00\u81F4 spring.main.allow-bean-definition-overriding=true @@ -80,8 +81,7 @@ feign.device.name=cwos-portal feign.resource.name=cwos-portal feign.cwos-portal.name=cwos-portal feign.ninca-crk-std.name=ninca-crk-std -# Feign/Ribbon 默认从 Consul 按服务名发现 ninca-crk-std;Consul 无注册时出现「Load balancer does not have available server」。 -# 以下两行改为静态 ServerList(与下行 ninca-crk-std.ip 同目标时保持一致;若访客服务只部署在其它 IP/端口请一起修改): +# bootstrap \u5DF2\u4E0E V1 fat-jar \u5185\u7F6E\uFF1AConsul \u53D1\u73B0\u5173\u95ED\u3002\u9759\u6001 Ribbon \u4E0E ninca-crk-std.ip \u6309\u73AF\u5883\u4E00\u81F4\u4FEE\u6539\u3002 ninca-crk-std.ribbon.NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList ninca-crk-std.ribbon.listOfServers=10.128.161.95:16106 feign.davinci-portal.name=cwos-portal diff --git a/maven-cw-elevator-application/deploy/v1-legacy/bootstrap.properties b/maven-cw-elevator-application/deploy/v1-legacy/bootstrap.properties index e7611f36..87182305 100644 --- a/maven-cw-elevator-application/deploy/v1-legacy/bootstrap.properties +++ b/maven-cw-elevator-application/deploy/v1-legacy/bootstrap.properties @@ -1,4 +1,13 @@ -# 与 JAR 同目录,Spring Cloud 会加载本文件,覆盖 jar 内 bootstrap.properties 中的旧 Consul 地址。 -# 对应 192.168.3.12 上 Docker: hashicorp/consul:1.22(8500) +# 与 JAR 同目录,覆盖 jar 内 bootstrap;Consul 段与 V1 运行包对齐。 +# Dubbo/ZooKeeper 仅 V1 fat-jar 内嵌使用;若启动报 ZK 相关错误再于外置 application 中处理。 spring.cloud.consul.host=192.168.3.12 spring.cloud.consul.port=8500 +spring.cloud.consul.enabled=true +spring.cloud.consul.discovery.register=true +spring.cloud.consul.discovery.enabled=false +spring.cloud.consul.discovery.prefer-ip-address=true +spring.cloud.consul.discovery.instance-id=${spring.application.name}-${spring.cloud.client.ipAddress}:${server.port} +spring.cloud.consul.discovery.ip-address=${spring.cloud.client.ipAddress} +spring.cloud.consul.discovery.deregister=false + +spring.profiles.active=access-control diff --git a/maven-cw-elevator-application/deploy/v2-maven/application.properties b/maven-cw-elevator-application/deploy/v2-maven/application.properties index 127db35b..3716e2fd 100644 --- a/maven-cw-elevator-application/deploy/v2-maven/application.properties +++ b/maven-cw-elevator-application/deploy/v2-maven/application.properties @@ -1,6 +1,7 @@ # deploy/v2-maven \uFF1Amaven \u6784\u5EFA cw-elevator-application-2.0.0.jar\uFF08\u540C\u76EE\u5F55\u542F\u52A8\uFF09 server.port=18081 -spring.application.name=cw-elevator-application +server.tomcat.uri-encoding=UTF-8 +spring.application.name=elevator-app # Boot 1.5 \u65E0 spring.main.allow-bean-definition-overriding\uFF1B\u82E5\u91CD\u590D Bean \u9700\u5728\u4EE3\u7801\u4FA7\u6D88\u6B67\u4E49\u6216\u5347\u7EA7 Spring Boot @@ -80,7 +81,8 @@ feign.device.name=cwos-portal feign.resource.name=cwos-portal feign.cwos-portal.name=cwos-portal feign.ninca-crk-std.name=ninca-crk-std -# 见 v1-legacy 同段注释:Consul 无 ninca-crk-std 时用静态 Ribbon 列表。 +# bootstrap \u5DF2\u4E0E V1 \u5BF9\u9F50 spring.cloud.consul.discovery.enabled=false\uFF08\u4E0D\u4ECE Consul \u62C9\u5B9E\u4F8B\uFF09\u3002 +# Feign \u8D70 Ribbon \u65F6\u4ECD\u9700\u9759\u6001\u5B9E\u4F8B\uFF08V1 \u8FD0\u884C\u5305\u672A\u5199\u6B64\u6BB5\uFF0CV2 \u8865\u9F50\u5E76\u914D NincaCrkStdRibbonConfiguration\uFF09\u3002\u4E0E ninca-crk-std.ip \u4E00\u540C\u6309\u73AF\u5883\u6539\u3002 ninca-crk-std.ribbon.NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList ninca-crk-std.ribbon.listOfServers=10.128.161.95:16106 feign.davinci-portal.name=cwos-portal diff --git a/maven-cw-elevator-application/deploy/v2-maven/bootstrap.properties b/maven-cw-elevator-application/deploy/v2-maven/bootstrap.properties index bb898826..9bbe000f 100644 --- a/maven-cw-elevator-application/deploy/v2-maven/bootstrap.properties +++ b/maven-cw-elevator-application/deploy/v2-maven/bootstrap.properties @@ -1,3 +1,14 @@ -# 覆盖 fat-jar 内嵌 Consul 地址,指向局域网 Docker Consul。 +# 与 V1 运行包 cw-elevator-application-V1.0.0.20211103/bootstrap.properties 中 Consul 段对齐。 +# Dubbo/ZooKeeper:V1 fat-jar 内含 dubbo 注册地址,本 Maven V2 工程未使用 Dubbo,故不写 zookeeper 段。 +# Consul 宿主机按本环境(局域网 Docker)覆盖。 spring.cloud.consul.host=192.168.3.12 spring.cloud.consul.port=8500 +spring.cloud.consul.enabled=true +spring.cloud.consul.discovery.register=true +spring.cloud.consul.discovery.enabled=false +spring.cloud.consul.discovery.prefer-ip-address=true +spring.cloud.consul.discovery.instance-id=${spring.application.name}-${spring.cloud.client.ipAddress}:${server.port} +spring.cloud.consul.discovery.ip-address=${spring.cloud.client.ipAddress} +spring.cloud.consul.discovery.deregister=false + +spring.profiles.active=access-control