序文
このトピックが何を意味するのか簡単に説明しましょう。
プロジェクトが SpringCloud プロジェクトの場合、SpringCloud Alibaba を統合するなど、ローカル構成をクラウド構成センターに書き込むことができます。Nacos を使用して、構成を Nacos に書き込むことで、セキュリティを確保できます。
SpringBoot プロジェクトの場合、設定のほとんどはローカルに直接書き込まれており、コードが漏洩すると設定ファイルの内容が発見され危険が生じるため、SpringBoot プロジェクトの設定ファイルもクラウドまたはリモートから取得されるため、プロジェクトのセキュリティははるかに高くなります。
そこで、コンフィグレーションセンターと同様の方法を検討します。簡単なコンフィグレーションセンターを自分たちで構築し、そのコンフィグレーションセンターにHTTPリクエストを送信してコードをプルし、存在しない形式でコンフィグレーションを行うこともできます。地元で。
私のアイデアは、小さな Web ページを作成し、その Web ページに対応するデータベースに構成を保存することです。つまり、内部担当者が使用する管理システムを作成し、この管理システムに構成を入力できます。これは次のようなものです。ナコス。
その後、いくつかのパラメーターを指定して管理システムにリクエストを送信するだけで、構成システムが構成を返してくれるので、SpringBoot プロジェクトはリモートから構成を取得することもできます。
一連の考え
当社の実装方法は、jarパッケージをパッケージ化してmavenウェアハウスにパッケージ化し、プロジェクトを使用する必要がある限りプロジェクトをpullするというものです。
その後、ロードする必要がある構成情報を構成し、構成センターから唯一の構成を取得できるようにするためにいくつかのプロジェクト パラメーターを指定する必要があります。たとえば、プロジェクトの ID、プロジェクトの開発環境環境、および構成センターからロードする必要があるその他の構成を指定します。
この構成では、jar パッケージでユーザーのローカル構成を読み取るためにいくつかの情報をカプセル化する必要があります。つまり、ユーザーのローカル構成ファイルを読み取る必要があります。最初に、最終情報を格納するクラスを開発します。
public class AppProperties {
//默认开发组
private static final String DEFAULT_GROUP = "Default";
private static String projectName;//项目名称
private static String environment;//开发环境
private static String group;//开发组
public AppProperties() {
}
public static String getGroup() {
return group;
}
public static String getAppName() {
return projectName;
}
public static String getEnvironment() {
return environment;
}
}
その後、ユーザーが構成ファイルを保存するすべての場所を取得するために使用するクラスを作成する必要があります。構成ファイルは、ClassPath、System、UserDir、Environment のカテゴリに分類できます。
public class ConfigCenterClientEnvironment {
private List<Property> propertySourcesList = new CopyOnWriteArrayList();
public ConfigCenterClientEnvironment() {
this.propertySourcesList.add(new EnvironmentProperty());
this.propertySourcesList.add(new SystemProperty());
this.propertySourcesList.add(new UserDirProperty());
this.propertySourcesList.add(new ClassPathProperty());
}
private String getByOrder(String name) {
Iterator i$ = this.propertySourcesList.iterator();
String value;
do {
if (!i$.hasNext()) {
return null;
}
Property propertySources = (Property)i$.next();
value = (String)propertySources.get(name);
} while(!StringUtils.isNotBlank(value));
return value;
}
public String getEnvironment() {
return this.getByOrder("environment");
}
public String getProjectName() {
return this.getByOrder("projectName");
}
public String getGroup() {
return this.getByOrder("group");
}
}
以下は、システム構成を取得するクラスをポストするだけです。
public class SystemProperty extends Properties {
public SystemProperty() {
String projectName = System.getProperty("projectName");
String environment = System.getProperty("environment");
String group = System.getProperty("group");
if (StringUtils.isNotBlank(projectName)) {
this.put("projectName", projectName);
}
if (StringUtils.isNotBlank(environment)) {
this.put("environment", environment);
}
if (StringUtils.isNotBlank(group)) {
this.put("group", group);
}
}
}
これは、ClassPath から構成を取得する方法と似ていますが、構成ファイルを取得する方法が、InputStream ストリームを使用して最初に構成ファイルを読み取り、構成ファイルが取得された後に構成ファイル内の対応する構成を読み取るように変更されている点が異なります。空ではない。
さて、これまでのところ、すべてのローカル設定ファイルを読み取って保存しました。そのため、必要なことは、これらの設定ファイルの情報に基づいて登録センターにリクエストを送信し、登録センターからデータを取得することです。
一般的なコードの記述方法は次のとおりです。projectName、env、group などの対応するパラメータを渡し、これらのパラメータを使用して登録センターのアドレス (http://xxx/xxx など) と照合します。 / そしてパラメータをスプライシングに追加します。後で、完全な URL 文字列を取得できます。ここでは、上記と同じ方法でローカルから構成センターのアドレスを読み取ることも選択できますが、これはあまり良いことではなく、そもそもこれを構成した理由がわからなくなります。
URL を取得したら、その URL をレジストリに送信し、JSON 文字列を取得します。
private List<ProjectConfig> getProjectConfigListFromRemote(String projectName, String env, String group) {
try {
String url = UrlBuilder.getConfigListByEnv(projectName, env, group);
String json = this.httpHelper.get(url);
this.currentStatus = "ready"; //当前是否被好发送
return JsonHelper.convertToProjectConfig(json);
} catch (Exception var6) {
this.currentStatus = "offline"; //配置中心离线 报错
logger.error(var6.getMessage(), var6);
throw new RuntimeException(var6.getMessage(), var6);
}
}
もちろん、現在のユーザーが構成を取得する権限を持っていることを確認するために、ユーザー チェックを追加することもできます。
class HttpHelper {
private String user;
private String password;
public HttpHelper(String user, String password) {
this.user = user;
this.password = password;
}
public String get(String url) throws Exception {
return this.HttpInvoker(url, "GET", this.user, this.password, (String)null);
}
public String post(String url, String body) throws Exception {
return this.HttpInvoker(url, "POST", this.user, this.password, body);
}
}
次に、Json 分析を通じて、構成センターから取得した構成を Json 経由で分析し、最終的なクラスを取得します。gson を使用して分析できます。gson 分析後は次のようになります。構成センターから構成を取得しました
。
取得した設定の形式は自分で定義しますが、後で解析するのに便利な限り、xml 設定を使用します。
構成を取得した後、これらの構成を使用していくつかのローカル クラスを構成する必要がある場合は、構成されたキーに従って構成に対応する値を直接取得し、値の文字列を解析して、値を属性に割り当てることができます。そしてクラスそれだけです。