标签: microservices

同时部署多个微服务的最佳实践有哪些?

如果发生影响多个服务的更改,我一直在努力寻找同时部署多个微服务的最佳方法。

虽然我对任何通用方法都感兴趣,但让我提供一个我遇到的具体示例。

我们公司使用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

0
推荐指数
1
解决办法
1598
查看次数

为什么我们需要在单独的服务层中编写业务逻辑而不是在控制器本身中编写?

创建不同的层(即服务层)来实现业务逻辑而不是在控制器本身中实现该业务逻辑有什么用

spring spring-mvc spring-boot microservices

0
推荐指数
1
解决办法
3396
查看次数

如何在单独的 docker 容器内配置和运行 Eureka Server、微服务(Eureka Client)、Zuul?

我是 Spring Boot 和 Docker 的新手。编写了以下微服务。

  1. 用户注册服务:在 MySql 数据库中创建用户,并使用 Rest Template 及其 Eureka 客户端与“搜索和删除服务”交互。GitHub链接
  2. 用户搜索和删除服务:从MySql数据库及其Eureka客户端搜索和删除。GitHub链接
  3. Eureka Server:用于服务发现。GitHub链接
  4. Zuul Server:用作 API 网关及其 Eureka 客户端。GitHub链接

我使用“Spring Boot STS”来开发服务。还使用“Spotify”依赖项来构建 Docker 映像。

我能够在本地主机(Windows)上运行 STS 的所有服务,并且一切正常。前面提到的所有三个服务都在 Eureka 服务器中注册。

但当我选择对服务进行 Docker 化时,一切都停止了。我创建了四个服务的四个 docker 镜像。

问题:在两个单独的容器中运行 Eureka 服务器和“用户注册服务”,但该服务未在 Eureka 中注册。事实上,所有服务都没有在 Eureka 注册。

我做了什么:

尝试1:

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 …

containers docker spring-boot microservices

0
推荐指数
1
解决办法
4258
查看次数

如何为 gRPC 服务器实例(在 Node 中)分配随机端口号?

在 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)

那样有用吗?我还没有弄清楚。我的目标是获取一个随机端口,然后查询服务器以获取分配的端口,以便向中央微服务注册表注册服务。

提前感谢您的帮助。

http node.js microservices server grpc

0
推荐指数
1
解决办法
3311
查看次数

我需要清洁建筑方面的演讲者吗?

我正在尝试在微服务中实现 Clean Architecture,该服务返回 JSON 响应。我是否需要演示者来呈现响应 DTO 或者只是将其发送回客户端

microservices clean-architecture

0
推荐指数
2
解决办法
2653
查看次数

多存储库 docker-compose

我有两个服务,位于两个不同的 GitLab 存储库,部署到同一主机。我目前正在使用supervisord来运行所有服务。每个存储库的 CI/CD 将代码推送到主机。

supervisord我正在尝试用 Docker替换。我所做的如下:

  1. Dockerfile为每个服务设置一个。
  2. 创建了第三个仅包含 的存储库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

0
推荐指数
1
解决办法
4970
查看次数

How to Send Emojis using RestTemplate in Spring Boot?

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)

java resttemplate spring-boot microservices spring-rest

0
推荐指数
1
解决办法
2323
查看次数

如何管理微服务架构使用的库依赖?

我的英语不好。所以如果你不明白,请告诉我。

我设计了微服务架构。每个服务都有相同的库,该库是团队成员制作的。

(这些库已经是分布式maven系统,并且我们使用了版本控制。)

我想知道如何管理这些常见的库依赖项(版本)。有时,如果库版本发生变化,我们必须检查所有服务并升级依赖项。

于是有人对我说。 Try to make common library which has all library dependency, than other services use that common library.

但我不喜欢这些想法。这最适合微服务架构吗?

如何管理微服务架构使用的库依赖?

谢谢你!

system-design microservices

0
推荐指数
1
解决办法
1494
查看次数

如何使用速率限制器/断路器(架构问题)

我们的微服务后端具有以下架构。

< 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

rate-limiting circuit-breaker microservices

0
推荐指数
1
解决办法
2424
查看次数

Spring Cloud 配置中的 spring.cloud.config.label 属性有什么作用?

我正在学习 Spring Cloud Config v3.0.5。我在学习文档的时候时,我发现文档提到了这一点

\n
\n

例如,您可能希望将配置标签与您的分支对齐,但将其设为可选(在这种情况下,请使用 spring.cloud.config.label=myfeature,develop)。

\n
\n

我不知道 \xe2\x80\x99t 知道\xe2\x80\x9calign 配置标签\xe2\x80\x9d是什么意思。但我猜应该是修改url中{label}的默认值(默认值为master)\n在此输入图像描述

\n

但是,当我设置spring.cloud.config.label=dev并访问 http://localhost:3344/config-dev.yml 时,我仍然在 master 分支上获取数据。\n在此输入图像描述\n
\n
\n在此输入图像描述\n
\n
\n那么 spring.cloud.config.label 属性有什么作用呢?文档中提到的“将配置标签与您的分支对齐”是什么意思?

\n

java spring spring-boot microservices spring-cloud

0
推荐指数
1
解决办法
4343
查看次数