本日の資料について
資料
https://docs.google.com/presentation/d/1OZFgxuJQacfTc-3SY-ldxEE4OM3KUaUocdwIdkmy1z8/edit?usp=sharing
1
古いサービスでも�マイクロサービスがしたい
JJUG CCC 2018 SPRING 2018/05/26
#jjug_ccc #ccc_a6
フリュー株式会社
佐藤慧太 @SatohJohn
自己紹介
3
本日の目的
4
目次
5
「古いサービス」とは
6
JJUG CCCとフリュー
7
ピクトリンク
8
ピクトリンク
9
ピクトリンク
などなどたくさんの機能がある
10
ピクトリンク
11
ピクトリンク
12
全部 Spring Framework
マイクロサービスを
Spring Framework�でしか利用できてない
13
古いフレームワークが
マイクロサービスの恩恵を�受けていない
14
解決したいこと
15
Spring Cloud Config�(Netflix Eureka)
16
Netflix Eureka
17
Netflix Eureka
18
Netflix Eureka
19
Spring Cloud Config
20
課題
21
構成
22
解決方法1
23
Eureka Clientを使う
25
ConfigurationManager.loadPropertiesFromResources(
"netflix.properties");
EurekaClient eurekaClient = new DiscoveryClient(
applicationInfoManager,
new DefaultEurekaClientConfig());
InstanceInfo nextServerInfo = eurekaClient.getNextServerFromEureka(
"config-test",
false);
String url = "http://" + nextServerInfo.getHostName() + ":" + nextServerInfo.getPort() + "/my-id/prod/master"
Eureka Clientを使う(netflix.properties)
26
eureka.region=default
eureka.hostname=config-access-test # Eurekaに登録される名前
eureka.registration.enabled=false # Eureka上に登録するか
eureka.serviceUrl.default=http://localhost:11801/eureka
社内ライブラリとして�提供してみた
27
失敗したところ
28
失敗したところ
29
じゃあ、もともと利用していた�Ribbon Clientを使おう
30
しかし、忘れていた事が�ありました
31
我々のアプリケーションは�すこし特殊でした
34
(^o^) < こまったぞ
35
解決方法2
36
Http Clientを使う
37
HttpGet eurekaAccess = new HttpGet();
eurekaAccess.setURI(
URI.create("http://localhost:11801/eureka/apps/config-test"));
eurekaAccess.setHeader("Accept", "application/json");
CloseableHttpResponse response = HttpClientBuilder.create()
.setRetryHandler(new DefaultHttpRequestRetryHandler())
.build()
.execute(eurekaAccess)
Iterator<JsonNode> propertySources =
mapper.readTree(response.getEntity().getContent())
.findValue("instance").elements();
String content = propertySources.next().toString();
Demo
38
まとめ
39
Spring Cloud Stream
(Apache Kafka)
40
背景
41
課題
42
Spring Cloud Streamとは
43
Apache Kafkaとは
44
Apache Kafkaとは
45
Apache Kafkaとは
�
46
通常のリクエストと違う点
47
Spring Cloud Stream(build.gradle)
48
dependencies {
compile 'org.springframework.cloud:spring-cloud-starter-stream-kafka:2.0.0.RELEASE'
}
Spring Cloud Stream(Sourceの作成)
49
Properties properties = new Properties();
properties.put(
ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
kafkaEndpoint);
properties.put(
ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
LongSerializer.class);
properties.put(
ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
JsonSerializer.class);
KafkaProducer<Long, Message> producer =
new KafkaProducer<>(properties);
Spring Cloud Stream(Sourceの作成)
50
String topic = "jjug-2018";
Message dto = new Message();
producer.send(new ProducerRecord<>(
topic, System.currentTimeMillis(), dto
), (recordMetadata, e) -> {
if (e != null) System.out.println(e.getMessage());
if (recordMetadata != null) System.out.println(recordMetadata);
});
producer.flush();
Spring Cloud Stream(Sink側 pom.xml)
51
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-kafka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies><dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency></dependencies>
</dependencyManagement>
Spring Cloud Stream(Sink側)
52
@SpringBootApplication
@EnableBinding(Sink.class)
public class KafkaDemoApplication {
@StreamListener(Sink.INPUT)
public void log(Message message) {
System.out.println("received " + message.message);
}
public static void main(String[] args) {
SpringApplication.run(KafkaDemoApplication.class, args);
}
}
Demo
53
構成
54
すごい便利
55
考えたところ
56
Topicの設計
57
Topicの設計
58
Topicの設計
59
メッセージ内容の変更方法
60
メッセージ内容の変更方法
61
あくまで個人の所感です
62
まとめ
63
全体まとめ
64
まとめ
65
でもやっぱり
66
Spring Bootの
マイクロサービスは楽
67
本日の目的
68
69
70
Fin
71