如果发生影响多个服务的更改,我一直在努力寻找同时部署多个微服务的最佳方法。
虽然我对任何通用方法都感兴趣,但让我提供一个我遇到的具体示例。
我们公司使用AWS和Elastic Beanstalk为一个网站部署微服务容器,相对解耦。现在我们的网络应用程序包括:
用 Angular 编写的 SPA,部署并托管在 S3 存储桶中(称为 SPA)
一个 webapi 服务,用 .NET Core 编写,经过 Docker 化,并部署到弹性 beanstalk 应用程序(称为 WebAPI)
一个集成服务,用 Node.JS 编写,经过 Docker 化,并部署到弹性 beanstalk 应用程序(称为 IntService)
SPA 和 WebAPI 通过 REST API 进行对话
WebAPI 和 IntService 是松散耦合的,并通过 AWS SQS 队列相互通信。
如果我们对其中任何一项服务进行更改,我们的部署过程都相当简单。例如,如果我们对 WebAPI 进行了更改,我们会启动一个新的 Elastic beanstalk 应用程序环境,部署在那里,然后交换 URL(基本的蓝绿部署)。
但是,如果发生影响多个服务的更改,我将很难找到正确的方法。例如,假设有一项功能需要同时更改 WebAPI 和 IntService。由于它们都位于自己的存储库中,因此它们都有自己的 CI 和 CD 管道,彼此独立。
如果只部署一项服务,整个应用程序可能会崩溃。人们如何处理这种类型的部署?您是否克隆 WebAPI 和 IntService 环境,部署这两个环境,然后交换两个 URL,只是确保几乎同时执行此操作,以最大限度地缩短只有一项服务处于活动状态的时间窗口?
或者,我们正在考虑使用 API 网关。但这是否意味着每次我们想要部署时,我们都会创建一个新的 API 网关阶段?如果我们这样做,蓝绿部署“交换”实际上是否发生在 API 网关中?
抱歉,如果这令人困惑,但我只是想了解一下我所想象的微服务的一个相当常见的问题。
amazon-web-services continuous-deployment amazon-elastic-beanstalk microservices
创建不同的层(即服务层)来实现业务逻辑而不是在控制器本身中实现该业务逻辑有什么用
我是 Spring Boot 和 Docker 的新手。编写了以下微服务。
我使用“Spring Boot STS”来开发服务。还使用“Spotify”依赖项来构建 Docker 映像。
我能够在本地主机(Windows)上运行 STS 的所有服务,并且一切正常。前面提到的所有三个服务都在 Eureka 服务器中注册。
但当我选择对服务进行 Docker 化时,一切都停止了。我创建了四个服务的四个 docker 镜像。
问题:在两个单独的容器中运行 Eureka 服务器和“用户注册服务”,但该服务未在 Eureka 中注册。事实上,所有服务都没有在 Eureka 注册。
我做了什么:
Ran the Eureka server and client using below commands:
Run Code Online (Sandbox Code Playgroud)
docker run --rm -it --name eurekaserver-container -p 8761:8761 eurekaserver-alpine-linux
docker run --rm -it -d --name …
在 Node.js 中启动 http 服务器时,开发人员可以通过0如下传递来侦听随机可用端口:
const http = require('http')
const service = require('../my/service);
const server = http.createServer(service)
server.listen(process.env.PORT || 0) // <-- Random port by default!
Run Code Online (Sandbox Code Playgroud)
我想知道如何使用 gRPC 做同样的事情?就像是...
const grpc = require('grpc')
const services = require('./service_grpc_pb')
const server = new grpc.Server()
server.addService(services.MyService, { ... })
server.bind('0.0.0.0:0', grpc.ServerCredentials.createInsecure())
server.start()
Run Code Online (Sandbox Code Playgroud)
那样有用吗?我还没有弄清楚。我的目标是获取一个随机端口,然后查询服务器以获取分配的端口,以便向中央微服务注册表注册服务。
提前感谢您的帮助。
我正在尝试在微服务中实现 Clean Architecture,该服务返回 JSON 响应。我是否需要演示者来呈现响应 DTO 或者只是将其发送回客户端
我有两个服务,位于两个不同的 GitLab 存储库,部署到同一主机。我目前正在使用supervisord来运行所有服务。每个存储库的 CI/CD 将代码推送到主机。
supervisord我正在尝试用 Docker替换。我所做的如下:
Dockerfile为每个服务设置一个。docker-compose.yml,该存储docker-compose up库在其 CI 中运行以构建和运行这两个服务。我希望这个存储库只部署一次。我正在寻找一种docker-compose在部署这两项服务之一时自动更新的方法。
编辑:本质上,我试图找出使用docker-compose多存储库设置和一台主机的最佳方法。
我的docker-compose:
version: "3.4"
services:
redis:
image: "redis:alpine"
api:
build: .
command: gunicorn -c gunicorn_conf.py --bind 0.0.0.0:5000 --chdir server "app:app" --timeout 120
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- redis
celery-worker:
build: .
command: celery worker -A server.celery_config:celery
volumes:
- .:/app
depends_on:
- redis
celery-beat:
build: .
command: celery beat …Run Code Online (Sandbox Code Playgroud) python continuous-integration docker microservices docker-compose
My requirement is to send JSON data from service (A) to another service (B), in this case, I am sending emojis in JSON using Spring Boot RestTemplate. If I send a request from A to B, in the service B the message is displayed as a text with a question mark(?) instead of emoji.
Sending this JSON data
{
"from": "1233222225",
"to": "8585855858",
"message": "Hello A, hope you are doing 23012020 "
}
Run Code Online (Sandbox Code Playgroud)
displays in service B as
{
"from": …Run Code Online (Sandbox Code Playgroud) 我的英语不好。所以如果你不明白,请告诉我。
我设计了微服务架构。每个服务都有相同的库,该库是团队成员制作的。
(这些库已经是分布式maven系统,并且我们使用了版本控制。)
我想知道如何管理这些常见的库依赖项(版本)。有时,如果库版本发生变化,我们必须检查所有服务并升级依赖项。
于是有人对我说。
Try to make common library which has all library dependency, than other services use that common library.
但我不喜欢这些想法。这最适合微服务架构吗?
如何管理微服务架构使用的库依赖?
谢谢你!
我们的微服务后端具有以下架构。
< Nginx> -----> <Facade Layer(built in JAVA/Springboot> -------Load Balancer(HAProxy) --- <Service Layer(built in JAVA/Springboot)>
Run Code Online (Sandbox Code Playgroud)
流量到达 Nginx,代理传递到 Facade,Facade 调用服务(通过负载均衡器)。我们没有使用服务发现。它是 Nginx 的 IP Facades/HAProxy 的服务 IPs 的静态映射。
现在我想使用速率限制器/断路器。我们应该在架构中的哪个点执行此操作?我的意思是我们应该再添加一跳还是其他什么?
我们计划为此使用resilience4j
我正在学习 Spring Cloud Config v3.0.5。我在学习文档的时候时,我发现文档提到了这一点
\n\n\n例如,您可能希望将配置标签与您的分支对齐,但将其设为可选(在这种情况下,请使用 spring.cloud.config.label=myfeature,develop)。
\n
我不知道 \xe2\x80\x99t 知道\xe2\x80\x9calign 配置标签\xe2\x80\x9d是什么意思。但我猜应该是修改url中{label}的默认值(默认值为master)\n
但是,当我设置spring.cloud.config.label=dev并访问 http://localhost:3344/config-dev.yml 时,我仍然在 master 分支上获取数据。\n
\n
\n
\n
\n
\n
\n那么 spring.cloud.config.label 属性有什么作用呢?文档中提到的“将配置标签与您的分支对齐”是什么意思?
microservices ×10
spring-boot ×4
docker ×2
java ×2
spring ×2
containers ×1
grpc ×1
http ×1
node.js ×1
python ×1
resttemplate ×1
server ×1
spring-cloud ×1
spring-mvc ×1
spring-rest ×1