SpringCloudConfig Server にRailsからつなぐ

## About

Spring Bootを利用するProjectからRailsを利用するProjectにうつり、ふと、RailsからもSpringCloudConfigサーバーにつなげるクライアントGemがあるのではないかと思って調べてみました。

## Spring Cloud Configとは

設定情報をGitなどで管理し、設定情報を返すサーバーの役割をするマイクロサービス（Spring Cloud Config Server） と、クライアントとなる設定を利用するマイクロサービスにより設定情報を活用します。クライアントの設定を利用するマイクロサービスは、　Spring Cloud Config ClientのJarをロードすることと、　Config ServerのURL等情報のみで設定を利用することができます。

https://spring.io/projects/spring-cloud-config


## ConfigServerをたてます

github上でサンプルを探してConfigServerをたてます。　こちらを利用しました。

https://github.com/ericdahl/spring-cloud-config-example

README.md  にあるように実行するか、　``mvnw spring-boot:run``で実行できますが、少しだけ中身に触れておきます。

pom.xml(抜粋）はつぎのとおりで、　bootのバージョンは``2.3.3.RELEASE``で、``spring-cloud-config-server``をdependencyに追加します。

```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 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

....

```

設定情報のデータソースは、　bootstrap.yml に次のように定義します。

```yml
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://{設定を保存するリポジトリ}
          searchPaths: 　{リポジトリ内で設定を保存するフォルダ}
```

Spring Boot Application に以下のようにアノテーション`@EnableConfigServer`を追加します。

```java
@SpringBootApplication
@EnableConfigServer
public class Application {
    public static void main(String args[]) {
        SpringApplication.run(Application.class, args);
    }
}
```

設定を利用するクライアントのマイクロサービスは、　pom.xml に次のように　　config client のdependencyを追加し、

```xml
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-config-client</artifactId>
</dependency>
```

bootstrap.ymlに次のように、　　config server のURLを設定します。

```yaml
pring:
  application:
    name: config-client-test
  cloud:
    config:
      env: default # optional
      label: master # optional
      uri: http://localhost:8888 # optional
```

## Rubyでの利用について


ここまでは全段で、　spring-bootでのconfig serverの利用についてを簡単に記載しました。ここからはRubyでの利用について記載していきます。
Googleで検索してみると、

https://github.com/pivotal-legacy/chemtrails

が見つかったのですが、　今回試したRails6には対応していないようでした。また、config serverのサポートバージョンもコミットコメントからv2までのようです。もうひとつは、

https://github.com/FlowerWrong/scc_ruby

というものでした。こちらは、　Gemfileに`gem 'scc_ruby'`を追加するのみで利用できました。次のように利用できます。

```rb
h = SccRuby::Api.fetch('http://localhost:8888', 'sample', Rails.env)
```

## クライアントライブラリは要らない？

ここで思ったのが、HTTPでとってこれば良いので、クライアントライブラリを利用しなくても良いのではということです。例えば次のように取得できます。

```rb
uri = URI.parse("http://localhost:8888/sample/" + Rails.env)
response = Net::HTTP.get_response(uri)
```

## 他の言語のクライアント

中は見ていませんが、　　python のクライアントに次のようなものがあるようです。

https://pypi.org/project/config-client/

https://pypi.org/project/spring-config-client/

spring-config-clientのほうは　2019から更新されていませんが、config-clientは　2021/04の更新がありました。

go-langも調べてみました。

https://github.com/Piszmog/cloudconfigclient

も　２０２１の更新がありました。

## まとめ

- Spring Cloud Configに他の言語のクライアントから繋ぐことができる
- クライアントライブラリを利用することができるが、ライブラリが古いことがありそう
- ライブラリを利用しなくてもHTTPで繋いで設定を取得することができる。