springcloudを使用する場合、一般にspringcloud configserverを使用して構成を取得し、構成は通常gitに保存されます。ファイル形式は変更や参照に便利で、実際に設定をデータベースに保存することもできます。
しかし最近、H3C プライベート クラウドを使用するときに問題が見つかりました。つまり、クラウドには、Eureka、ConfigServer、および GateWay を自動的に作成およびデプロイできるマイクロサービス エンジンが付属していますが、ConfigServer を構成する場合、データベースに保存されるのは構成のみであることがわかります。埋められる。これは以前の開発方法と同じではありません。
そこで、データベースアドレスを入力して「作成」をクリックしようとしたところ、データベースh3c_pring_cloudが自動的に作成されたことがわかりました。
その中にはいくつかのテーブルがあります。
spring_cloud_config
スプリングクラウドゲートウェイ
spring_cloud_gateway_jwt
spring_cloud_route_subsidiary
spring_cloud_route_to_subsidiary
spring_cloud_config が設定を保存するテーブルであることがわかります。テーブル構造は次のようになります。
有用なフィールドは config_key/config_value/application であることは明らかです。
したがって、データの一部を挿入してみます。名前、アプリケーション、config_key、config_value のみを挿入し、その他は空のままにしてください。
名前は test-app に設定されます
アプリケーションは test-app-dev に設定されます
config_key と config_value は無造作に設定されます
ブラウザを使用して構成センターに直接アクセスします。
curl http://localhost:8080/test-app-dev/default/
このアドレスがデフォルトで従う理由は、そのアドレスをフォローしないとアクセスできなくなる、つまりエラーページが返されるためです。なぜデフォルトに設定するのかというと、 spring.profiles.active の場合だからです。 springboot では指定されていないため、デフォルトはデフォルトです
結果は以下の通り。
必要なデータが返されませんでした。ということで、プロフィール欄の問題かなと思い、プロフィール欄をデフォルトに設定してみました。ここでプロファイルをデフォルトに設定する場合は注意が必要です
再度実行しましたが、やはりデータが見つかりませんでした。
これは奇妙なことです。データは SQL を使用して直接見つけることができますが、クラウドの自動作成された ConfigServer でどのような SQL ステートメントが使用されているのかわかりません。ConfigServer は自動的に作成されるため、そのソース コードを表示することができません。途方に暮れていると、ふとクラウドにデータベースを作り直させたくなり、データベースを直接削除してしまい、今このタイミングで再度アクセスしたらどうなるだろうかと考えました。そこで、再度ブラウザを使用して ConfigServer にアクセスします。以下の結果が得られた。
返された結果から、作成したConfigServerのSQL文を偶然取得したところ、env_idが固定値だったので検索してみると、マイクロサービスエンジン作成時に生成された値だったので、env_idフィールドを設定しました。データ内の値をこの値にします。ブラウザを再利用してリクエストを開始し、結果を返します。
その結果、まだデータがなくて憂鬱ですが、残りの null フィールドを見てみると、ラベルが 1 つしかなく、怪しいのですが、どのような値を設定すればよいでしょうか?
なぜこの問題に苦労するのですか? ブラウザからアクセスしてラベルを変更するのは非常に便利ですが、主に Spring プロジェクト (通常はマスター) で使用されます。したがって、ラベルをマスターに設定します。
今すぐ訪問
curl http://localhost:8080/test-app-dev/default/
データを取得しました。
しばらく調べた後、おそらくその ConfigServer がどのように書かれているかがわかりました。次のコードを貼り付けます。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
アプリケーション.yml
server:
port: 8080
context-path: /
spring:
profiles:
active: jdbc
application:
name: CONFIG_SERVER
datasource:
url: jdbc:mysql://10.116.67.115:3306/h3c_pring_cloud
password: root
username: root
driver-class-name: com.mysql.jdbc.Driver
cloud:
config:
server:
jdbc:
sql: SELECT config_key ,config_value from spring_cloud_config where env_id = 'asdfrsgt34fgfd' and APPLICATION=? and PROFILE=? and LABEL=?
enabled: true
Application.java
@EnableConfigServer
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
データベーススクリプト
DROP TABLE IF EXISTS `spring_cloud_config`;
CREATE TABLE `spring_cloud_config` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`env_id` varchar(100) DEFAULT NULL,
`application` varchar(100) DEFAULT NULL,
`profile` varchar(100) DEFAULT NULL,
`label` varchar(100) DEFAULT NULL,
`config_key` varchar(100) DEFAULT NULL,
`config_value` varchar(100) DEFAULT NULL,
`config_type` varchar(100) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`states` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `spring_cloud_config` VALUES (1342953439026266112,'test-app','asdfrsgt34fgfd','test-app-dev','default','master','spring.datasource.url','jbdc:mysql://127.0.0.1:3306/test',NULL,NULL,NULL,NULL);
次にデータベースを作成します。設定はブラウザアクセスで取得できるのですが、データベースを削除すると再度アクセスしてしまいます。
エラーページが表示されました。
その後、コンソールでもエラーが報告されていることがわかりました。
しかし、なぜクラウドで作成したConfigServerのページが表示されなかったのかというと、H3Cのマイクロサービスエンジンではconfigserverのログが見れないためで、クラウドで作成したConfigServerはSpringのグローバル例外ハンドリングを使っているのだろうかと思い、Aを追加してみるグローバル例外ハンドラ。
GlobalExceptionHandler.java
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(Exception.class)
public BaseResult globalException(HttpServletResponse response, Exception ex) {
BaseResult baseResult = new BaseResult();
baseResult.setCode(0);
baseResult.setTotal(0);
baseResult.setMsg(ex.getMessage());
return baseResult;
}
}
BaseResult.java
public class BaseResult {
private int code;
private String msg;
private int total;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
}
再試行して、返される結果がクラウドによって作成された構成サーバーの返される結果と一致していることを確認します。
最後に、configserver のマッピング ルールを確認できます。
同時に、この実験の後、mysql を使用して設定ファイルを保存するにはまだ多くの不便があることがわかりました。