SpringCloud微服务部署环境参数动态设置?-灵析社区

来自武功山的爱

更新: 我大概理解了你的问题了。 1. 你的问题应该是服务注册到nacos的时候,需要把实例的IP端口信息提交上去。问题出在每次部署的时候你需要手动指定这个上报的IP端口,比较麻烦。 这里可能会有问题: 1. gateway在转发请求到其他服务时,应该走“内网”传输。也就是服务应该使用内网IP去注册。所以你可以在启动的时候直接拿到节点的IP/端口(这个是完全可行的,和是不是传统部署都没有关系)。 2. 不知道你是不是使用了自动获取的方式去获取实例的IP,但是注册的时候出了问题,注册的服务都是docker容器内部的172.x开头的地址,这个问题导致了gateway没法正常工作。所以你才想到了去手动指定实例的IP。通过手动指定的方式也可以实现正常注册,但是没有必要多绕一圈。 如果你要用传统的方式部署微服务 1. 使用docker启动容器的时候,建议把网络模式改成host,这样在容器内,能直接获取到节点的IP,注册服务、在多节点的环境,gateway在转发时也都能正常工作。启动实例的时候直接 `docker run --network host -d image:tag` ,就不需要指定额外的参数了。 2. docker 默认情况下是只能单个节点运行的,即使 docker-compose 也是一样的。所以在每个节点上,不管怎么样都要考虑到端口分配问题,它需要手动去维护,所以是会有一些麻烦在。 3. 还是建议你试试用 docker swarm 来做容器编排,简单方便,虽然现在貌似用的不多,但还是docker官方推荐的生产环境部署方式之一。:[https://docs.docker.com/get-started/orchestration/](https://link.segmentfault.com/?enc=dY9DacIdWDW6Agb54bXx7Q%3D%3D.5SnCeqDY69KtUb5V3ZX%2FFeXSrQbaHT3%2FCX1NX%2FGKVxUljxPkw5qYOTM0xvQDNv9S%2FfieJ0Fip41I%2BEL5xC0VJg%3D%3D) * * * 问题1: 如何动态获取 VERSION 通常情况下,在构建的时候就能拿到版本号,通过脚本读取pom.xml文件(或者通过插件,但是实际上也是读取pom.xml) 问题2: 如何自动获取宿主机的SERVER_NAME 可以通过 “环境变量” * * * 我举一个使用 docker swarm 部署微服务的例子(k8s也类似): docker-compose.yml ,会启动 gateway / auth / core 三个服务 services: gateway: image: example/gateway:v1 environment: # 给这个服务添加环境变量 - ENVIRONMENT=prod #当前环境/服务名字/nacos注册信息 - SERVER_NAME=gateway - NACOS_SERVER=nacos.domain.com - NACOS_namespace=e35500e1-2441-4001-b60f-3f7d55bxxxxx ports: - "8080:8080" # 暴露网关的端口 deploy: mode: replicated replicas: 2 # 给这个服务部署两个实例,下面的操作都类似。 auth: image: example/auth:v1 environment: - ENVIRONMENT=prod - SERVER_NAME=auth - NACOS_SERVER=nacos.domain.com - NACOS_namespace=e35500e1-2441-4001-b60f-3f7d55bxxxxx deploy: mode: replicated replicas: 2 core: image: example/core:v1 environment: - ENVIRONMENT=prod - SERVER_NAME=core - NACOS_SERVER=nacos.domain.com - NACOS_namespace=e35500e1-2441-4001-b60f-3f7d55bxxxxx deploy: mode: replicated replicas: 2 环境变量,通常都是在“运行时”获取的,但是你可以把一些默认的环境变量,在“构建时”时写入到镜像中。 使用“ARG”也是可以的,但是感觉不太方便。 如果你已经用了微服务,就不建议用 纯docker 去手动管理容器和服务了,你应该把部署的工作交给 “容器编排系统” 来做,比如 k8s / docker-swarm 。 * * * nacos读取配置文件的时候,是可以直接从环境变量中取值的,可以不用手动传参数。 * * * 补充一个k8s部署的例子: apiVersion: apps/v1 kind: Deployment metadata: name: gateway spec: selector: matchLabels: app: gateway template: metadata: labels: app: gateway spec: containers: - name: gateway image: example/gateway:v1 resources: limits: memory: "128Mi" cpu: "500m" env: - name: ENVIRONMENT value: prod - name: SERVER_NAME value: gateway ports: - containerPort: 8000 --- apiVersion: apps/v1 kind: Deployment metadata: name: auth spec: selector: matchLabels: app: auth template: metadata: labels: app: auth spec: containers: - name: auth image: example/auth:v1 resources: limits: memory: "128Mi" cpu: "500m" env: - name: ENVIRONMENT value: prod - name: SERVER_NAME value: auth ports: - containerPort: 8000 --- apiVersion: apps/v1 kind: Deployment metadata: name: core spec: selector: matchLabels: app: core template: metadata: labels: app: core spec: containers: - name: core image: example/core:v1 resources: limits: memory: "128Mi" cpu: "500m" env: - name: ENVIRONMENT value: prod - name: SERVER_NAME value: core ports: - containerPort: 8000 --- apiVersion: v1 kind: Service metadata: name: gateway spec: selector: app: gateway ports: - port: 8000 targetPort: 8000 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress labels: name: example-ingress spec: rules: - host: example.domain.com http: paths: - pathType: Prefix path: "/" backend: service: name: gateway port: number: 8000

阅读量:1

点赞量:0

问AI