我正在编写一个应用程序,它由一些基于弹簧启动的微服务组成,前面有一个基于zuul的反向代理 -
当我在我的机器上启动服务时,它可以工作,但是对于服务器的推出,我想使用docker作为服务,但现在似乎不可能.
通常,您将在容器外部具有固定的"内部"端口和随机端口.但容器中的应用程序不知道外部端口(和IP).
Netflix工具符合我想要编写的高效微服务架构,概念上我非常喜欢docker.据我所知,启动容器会非常麻烦,在主机上收集外部端口并将其传递给应用程序,因为在应用程序启动后您无法简单地更改端口.
有没有办法使用eureka与基于docker的客户端?
[更新]我想我解释这个问题做得不好.所以也许这可以澄清一点:
eureka服务器本身可以在docker中运行,因为我只有一个,外部端口无关紧要.我可以使用链接功能从客户端访问它.
问题是客户端注册自己的URL.这是例如https:// localhost:8080 /但由于动态端口分配,它实际上只能通过https:// localhost:54321 /访问
因此,eureka将返回错误的服务URL.
更新 我已在下面更新了我的答案,所以看看那里.
我正在使用Eureka和Zuul开始使用Spring Cloud,并且在构建蓝色/绿色和Canary部署方面遇到了一些问题.到目前为止,我已经完成了基础工作,并让Eureka,Zuul和配置服务器按预期工作.我想要完成的是建立一个有两个版本的服务,比如1.0和1.1.对于特定用户的子集,我想将它们路由到1.1版本,其他人都应该转到1.0版本.
Zuul过滤器API对文档有点了解,我正在努力解决一些概念,所以我想我会在这里问几个问题.我还运行了一些基本的过滤器,除了获取他们请求的主体和服务的身份之外,它不会做很多事情.我在墙上的位置是了解如何向Eureka和Zuul公开同一服务的两个不同版本.我很好奇的一些事情:
/simpleservice,我会暴露两个不同的serviceIDs(即simpleservice和simpleservice-1.1)?如果我这样做,当其中一个目标用户请求时/simpleservice,我让Zuul发送给他们/simpleservice-1.1canary-deployment microservices spring-cloud netflix-eureka netflix-zuul
有没有办法根据弹簧配置文件禁用spring-boot eureka客户端注册?
目前我使用以下注释:
@Configuration
@EnableAutoConfiguration
@EnableDiscoveryClient
@EnableConfigServer
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要的是一个条件如(借用伪代码)
@if (Profile!="development")
@EnableDiscoveryClient
@endif
Run Code Online (Sandbox Code Playgroud)
或者在应用程序属性文件中的某种方式.我已经尝试将application.yml文件设置为:
spring:
profiles: development
cloud:
discovery:
enabled: false
Run Code Online (Sandbox Code Playgroud)
但这没效果.
我们有一个基础设施,包括服务发现和负载平衡(即服务器端与STM和weblogic集群).现在我们正在重构为微服务.我们需要一个API网关,它可以对其他微服务进行基本路由.Netflix Zuul看起来很不错,但是如果没有Eureka我就无法让Zuul工作 - 但我们不需要Eureka,因为我们已经有了服务发现和负载平衡.
谢谢.
在创建bean时,我需要检查YAML属性文件是否满足两个条件.我该怎么做,因为@ConditionalOnProperty注释只支持一个属性?
我正在使用Spring Boot和Spring Cloud(Zuul和Eureka)在单独的docker容器中运行构建微服务,这些容器部署在单独的Amazon EC2实例中.
我有一个简单的REST服务,它向Eureka注册,并已配置Zuul通过在Eureka中查找请求来将请求路由到此服务.

我可以使用boot2docker在Mac上本地运行(即不在Amazon/EC2中),但是当部署在EC2上时,Zuul无法找到服务,并报告"转发错误"(状态500).
在EC2中,一切都配置为在端口80上运行(只是在评估时,我可以通过我们的防火墙轻松访问).我可以在Eureka系统状态页面中看到Zuul和我的服务(尽管没有链接可用!).
客户端配置为使用完整的AWS域名查找Eureka,因此我可以看到他们如何找到Eureka OK.例如
client:
serviceUrl:
defaultZone: http://ec2-XX-XX-XX-XX.ap-southeast-2.compute.amazonaws.com:80/eureka/,http://ec2-YY-YY-YY-YY.ap-southeast-2.compute.amazonaws.com:80/eureka/
Run Code Online (Sandbox Code Playgroud)
但是,客户似乎正在使用其内部docker IP地址进行注册(基于Eureka系统状态链接).
edgeserver链接指向http://172.17.0.2/info 试用服务链接指向http://172.17.0.3/info
我猜这是不正确的,其他EC2实例不知道到达这个地址.
我已经阅读了这个页面https://github.com/Netflix/eureka/wiki/Configuring-Eureka-in-AWS-Cloud,建议使用AWS EC2弹性IP地址,但我希望我不必这样做.
我也看到目前有关于这个主题的讨论,https://github.com/spring-cloud/spring-cloud-netflix/issues/432
有没有人设法让这种类型的设置工作,如果是这样,他们是如何配置Eureka属性的?
我在我的项目中添加了 spring-cloud-starter-netflix-eureka-client gradle 依赖项并取消了依赖项。但是,当在我的主类中使用 @EnableEurekaClient 时,它会向我显示建议创建 @EnableEurekaClient 注释。不显示eureka客户端的任何导入文件。
Unresolved reference: EnableEurekaClient
Run Code Online (Sandbox Code Playgroud)
产品服务应用程序.kt
package com.main.productservice
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
@EnableEurekaClient
class ProductServiceApplication
fun main(args: Array<String>) {
runApplication<ProductServiceApplication>(*args)
}
Run Code Online (Sandbox Code Playgroud)
gradle.kt
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.5.2"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
kotlin("jvm") version "1.5.20"
kotlin("plugin.spring") version "1.5.20"
}
group = "com.main"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.
kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.springframework.cloud:spring-cloud-starter-netflix-eureka-client")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "11" …Run Code Online (Sandbox Code Playgroud) kotlin spring-boot spring-cloud netflix-eureka spring-cloud-netflix
我有一个eureka服务器和两个在docker容器中运行的休息服务(eureka客户端).如果第一个服务尝试访问第二个服务,我会收到UnknownHostException.原因是服务在eureka服务器上注册了dns服务器无法解析的容器主机名.
我认为解决方案可能是设置docker容器的主机名.所以我使用了带-h标志的docker来设置主机名:
docker run -h project-dev.net9.mycompany.com
但现在服务甚至无法在eureka服务器上注册.我得到这个例外:
2015-11-30 12:03:42.182 ERROR 1 --- [pool-2-thread-1] com.netflix.discovery.DiscoveryClient : Can't get a response from http://project-dev.net9.mycompany.com:8761/eureka/apps/MY-SERVICE/project-dev.net9.mycompany.com
Can't contact any eureka nodes - possibly a security group issue?
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused
at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:184)
at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:120)
at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:28)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
at com.sun.jersey.api.client.WebResource.put(WebResource.java:211)
at com.netflix.discovery.DiscoveryClient.makeRemoteCall(DiscoveryClient.java:1097)
at com.netflix.discovery.DiscoveryClient.makeRemoteCall(DiscoveryClient.java:1060)
at com.netflix.discovery.DiscoveryClient.access$500(DiscoveryClient.java:105)
at com.netflix.discovery.DiscoveryClient$HeartbeatThread.run(DiscoveryClient.java:1583)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) …Run Code Online (Sandbox Code Playgroud) java spring spring-cloud netflix-eureka spring-cloud-netflix
我在Docker中使用Kibna.
我使用docker-compose运行Kibana
下面是我的docker-compose.yml
`version: '2'
services:
elasticsearch:
image: elasticsearch
expose:
- 9200
ports:
- "9200:9200"
networks:
- cloud
fluentd:
build: ./fluentd
volumes:
- ./fluentd/conf:/fluentd/etc
links:
- "elasticsearch"
ports:
- "24224:24224"
- "24224:24224/udp"
networks:
- cloud
kibana:
image: kibana
links:
- "elasticsearch"
ports:
- "9201:5601"
networks:
- cloud
networks:
cloud:
driver: bridge`
Run Code Online (Sandbox Code Playgroud)
我想在Eureka发现注册表上注册此Kibana应用程序
所以我可以使用API网关来调用它
以下示例是我在Eureka上注册My API-gateway的方式
eureka:
client:
serviceUrl:
defaultZone: http://eureka-server:8761/eureka/
registry-fetch-interval-seconds: 60
instance:
hostname: api-gateway
prefer-ip-address: false
lease-renewal-interval-in-seconds: 5000
lease-expiration-duration-in-seconds: 5000
API网关是一个spring-boot应用程序,所以它很简单.
我正在使用docker(图片)运行kibana.我怎样才能做到这一点
任何帮助都会很明显.
提前致谢
netflix-eureka ×10
spring-cloud ×5
spring-boot ×4
docker ×3
netflix-zuul ×3
spring ×3
java ×2
kibana ×1
kotlin ×1
netflix ×1
rest ×1