会社のインセプション、ビジネスのボリュームが小さくて、すべてのビジネスロジックの世話をしてプログラム、今回のサーバーの数が少ないが、オンラインの簡単な、基本的な開発-テストは-開発者が、オンラインで行われます。
トラフィックの量が徐々に増加して、機能を高め、符号量が増加し、全体のプログラムを再コンパイルするために、単一のライン機能の必要性、コンパイル時間は数秒から数分または数分のさえ数十に、一方効率の低下で、一方の横方向の拡張に徐々に弱体化効果を高めるために、処理性能をもたらします。したがって、各サブモジュールのうち統一分割は、プログラムが大規模での「マイクロサービス」であろう。
マイクロサービスの性質上のメリットは自明であるが、多くのサービスが展開され、変更は確かに頭痛です。
どのようにこの問題を解決するには?Baiduは、別の後にサービス管理、サービスの標準化、プロセス、様々な用語の多くが、それは私にとって、本当にとてもフレンドリーこの初心者の特定の実装ではありません。
だから、オンラインニーズを満たし、自動パブリッシングシステムを実現するために、具体的な事業と組み合わせます。
背景
当社の開発スタッフは、スクリプトを介してパッケージをアップロードし、テストが渡され、新しい機能を完了し、プロセスといくつかの他の操作を開始します。
何ら問題は本当に乾燥していないので、ビジネスのために、それは、多くの場合、変更はありませんが、私は事業部は、ホストの数百に配備マイクロサービスの何百も、うちのスプリットを持っており、そのような操作は一日数十または倍の数百を行うべきです欠点は、解明する始めました。
- コンパイラパッケージ自体には長い時間がかかるし、サーバーとの長い待ち時間にアップロード
- 安心して古いドライバものの断片化されたスクリプトの束を、顔、本当に繰り返し作業に疲れてこれらの人々が解放されたとき
- 不測の事態がロールバックを必要とする場合、操作は虎のように、別の熾烈でした
それを行う方法。。。
パッケージには、長い時間をアップロードしますか?先に倉庫内のパッケージの、直接的大丈夫取るために時間を使う
離散スクリプトの束を?当然、それはスクリプトを引き継ぐことではなく、統一されたコール・インタフェースOK提供
ロールバックすることは困難を?あなたはどのバージョンを使用したいバージョンのバージョン管理
リリースおよびバージョン管理を実現するために、我々はサービスがホスト協会と実際に対応したサービスのバージョンをリリース、バージョン情報サービスを記録する必要があります。
既存のホストの管理はかつての首長によって設定された、テクノロジー・スタックがあるジャンゴ1.10.1すぐにそれを開発するために、これに基づいて機能を実現するために、非常に古いバージョン。
先に行き、ライト・コードへの老婦人はシャトルバスで、Ctrl + C、Ctrl + Vは頂点に達しています。
バージョン管理サービス
このサービスは、外部キーを作り、多くのバージョン、すべての情報を記録するテーブルが冗長フィールドがたくさんあることをバインドされている場合、それがサービスに分かれ、サービスバージョン2つのテーブルになります。Djangoは以下のモデルに対応します。
私たちのコードは、サービステーブルが記録されたアドレスgitlabを投影する対応するので、直接、gitlab-CI使用されている自作の建物のgitlab管理で構成されてい
from django.conf import settings
from django.db import models
class MicroService(models.Model):
LANGUAGE_TYPE = (
('cpp', 'cpp'),
('go', 'go'),
('python', 'python')
('other', 'other')
)
name = models.CharField(u'服务名称', max_length=64)
language = models.CharField(u'语言类型', max_length=16, choices=LANGUAGE_TYPE)
build_orig = models.CharField(u'构建来源', max_length=16, default='git')
build_url = models.CharField(u'构建地址', max_length=128) # gitlab or jenkins 的构建地址,用于触发构建任务
description = models.CharField(u'描述', max_length=256, null=True, blank=True)
created = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='created_by', on_delete=models.DO_NOTHING)
updated = models.DateTimeField(auto_now=True)
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='updated_by', on_delete=models.DO_NOTHING)
class Meta:
db_table = 'micro_service'
unique_together = (('name', ), )
ordering = ['-created']
タスクgitlabトリガー、ビルド、実行、成功、失敗、タイムアウトに用意されている状態のサービスのバージョンを構築する場合、繰り返し構造は、レコードの状態の変化を列挙するために使用することができ、変更されていないバージョンが作成され、これだけ創業者と作成時間
from enum import Enum, unique
@unique
class BuildStatus(Enum):
pending = 0
building = 1
success = 2
timeout = 3
failed = 4
duplicate = 5
class MicroServiceVersion(models.Model):
BUILD_STATUS = tuple([(v.value, k) for k, v in BuildStatus.__members__.items()])
microservice = models.ForeignKey(MicroService, on_delete=models.DO_NOTHING)
version = models.CharField(u'版本', max_length=48) # 版本号格式: 时间戳-提交分支-提交id
description = models.CharField(u'描述', max_length=128, null=True, blank=True)
created = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
status = models.PositiveSmallIntegerField(choices=BUILD_STATUS,default=1)
file_path = models.FilePathField(u'程序包存放路径', max_length=128, null=True, blank=True)
ref = models.CharField(u'构建分支', max_length=128, default='master')
class Meta:
db_table = 'micro_service_version'
unique_together=(('microservice', 'version'),)
ordering = ['-created', 'version']
サービスの例
サービスが実際にホストやサービスに関連するバージョンをリリースする予定。
- 展開は、インスタンステーブルに関連付けられたレコードのサービスバージョンをホストを作成します
- アップグレード、ロールバック、対応するインスタンスのバージョンを変更します
- 削除、削除データ
状態
我々は、削除、ロールバック、アップグレードなどを展開するとき、それはとても以降の再試行に操作を容易にするために、インスタンスの状態を記録するためにフィールドを使用し、何らかの原因による故障につながる可能性があります。
ロッキング
インスタンスSERVICE_A操作をアップグレードするために、ユーザAの場合は、ので、他のユーザーがSERVICE_Aインスタンスを操作することはできません、あなたはロック解除完了後にこれらのインスタンスのすべて、ユーザAの操作をロックすることができます
対応機種:
from asset.models import Asset
@unique
class InstanceStatus(Enum):
running = 0 # 运行中 大部分时候处于此状态
installing = 1
upgrading = 2
reverting = 3
deleting = 4
install_failed = 11
upgrade_failed = 12
revert_failed = 13
delete_failed = 14
class MicroServiceInstance(models.Model):
STATUS = tuple([(v.value, k) for k, v in InstanceStatus.__members__.items()])
microservice = models.ForeignKey(MicroService, on_delete=models.DO_NOTHING)
version = models.ForeignKey(MicroServiceVersion, on_delete=models.DO_NOTHING)
host = models.ForeignKey(Asset, on_delete=models.DO_NOTHING)
port = models.IntegerField(u'端口号', null=True, blank=True, )
tag = models.CharField(u'标签', max_length=64, blank=True, null=True)
weight = models.PositiveSmallIntegerField(u'权重', default=100)
description = models.CharField(u'描述', max_length=128, blank=True, null=True)
created = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
status = models.PositiveSmallIntegerField(u'实例状态', choices=STATUS, default=0)
locked = models.BooleanField(u'操作锁定', default=False)
is_maintain = models.BooleanField(u'是否维护中', default=False) # 保留字段
class Meta:
db_table = 'micro_service_instance'
ordering = ['-created']
関係、バージョン、インスタンスを明確に、データモデルを構築し、次のステップは、図です。