반응형
IBM Clouders 1기 활동.
구글 클라우드 플랫폼은 자사의 클라우드를 활용해 다양한 서비스를 실습할 수 있는 환경을 제공한다.
Coursera 교육 콘텐츠의 hands-on Lab으로도 활용하고, 여러 서비스를 묶어 하나의 실습 프로그램을 만든 뒤 유료로 제공하기도 한다.
IBM Cloud는 클라우드 관련 지식과 정보는 https://cognitiveclass.ai/라는 교육플랫폼에서 얻을 수 있다.
지금까지 세 개의 과목을 들었는데, 유튜브 강의와 퀴즈를 제공하지만 hands-on Lab 형태의 수업은 포함되어 있지 않았다.
뭔가 아쉬운 마음에 IBM Cloud에서 제공하는 튜토리얼을 돌아다니고 있었는데,
IBM Cloud에서도 hands-on Lab 서비스를 개발하고 있다는 정황을 확인했다.
https://labs.cognitiveclass.ai/
아직 cognitiveclass 수업과 연동된 클래스가 없고, UI도 뭔가 어설프지만
IBM Cloud 서비스를 활용한 실습을 제공하려는 사이트다.
Java 프로그램으로 integer를 stream하고, kafka에서 두 개의 토픽을 만들어 데이터를 저장하고 반환하는 실습을 진행해봤다.
Reactive and event streaming app development with Apache Kafka and Java
package org.acme;
import io.reactivex.Flowable;
import org.eclipse.microprofile.reactive.messaging.Incoming;
import org.eclipse.microprofile.reactive.messaging.Outgoing;
import javax.enterprise.context.ApplicationScoped;
import java.util.Random;
import java.util.concurrent.TimeUnit;
/*
Generates a random weather wind reading every second between 0 and 50 in km/h
*/
@ApplicationScoped
public class WindGenerator {
private Random random = new Random();
// 랜덤한 숫자를 windSpeedKph라는 channel으로 내보내는 코드.
@Outgoing("windSpeedKph")
public Flowable<Integer> generate() {
return Flowable.interval(1, TimeUnit.SECONDS)
.map(tick -> random.nextInt(50));
}
// windSpeedManual Channel에서 input을 받아
// windSpeedKph Channel로 전송하는 코드.
// 랜덤한 정수를 자동으로 생성하는 대신, windSpeedManual은 HTTP POST로 임의의 정수값을 전송한다.
@Incoming("windSpeedManual")
@Outgoing("windSpeedKph")
public Integer generateManual(int windSpeedManual) {
return windSpeedManual;
}
}
package org.acme;
import org.eclipse.microprofile.reactive.messaging.Channel;
import org.jboss.resteasy.annotations.SseElementType;
import org.reactivestreams.Publisher;
import javax.inject.Inject;
import javax.ws.rs.*;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.eclipse.microprofile.reactive.messaging.Emitter;
import javax.ws.rs.core.Response;
@Path("/windSpeed")
public class WindSpeedResource {
@Inject
@Channel("windSpeedMph") Publisher<Double> windSpeed;
@GET
@Path("/stream")
@Produces(MediaType.SERVER_SENT_EVENTS)
@SseElementType("text/plain")
public Publisher<Double> stream() {
return windSpeed;
}
@Inject
@Channel("windSpeedManual") Emitter<Integer> windSpeedEmitter;
@POST
@Path("/generate/{speed}")
public Response generate(@PathParam("speed") Integer speed) {
windSpeedEmitter.send(speed);
return Response.status(Response.Status.CREATED).entity(speed).build();
}
}
package org.acme;
import io.smallrye.reactive.messaging.annotations.Broadcast;
import org.eclipse.microprofile.reactive.messaging.Incoming;
import org.eclipse.microprofile.reactive.messaging.Outgoing;
import javax.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class WindSpeedConverter {
private static final double KphToMph = 0.621371;
@Incoming("windSpeed")
@Outgoing("windSpeedMph")
@Broadcast
public double process(int windSpeedinKph) {
return windSpeedinKph * KphToMph;
}
@Incoming("windSpeedMph")
public void showProcessedData(double windSpeedinMph) {
System.out.println("processed data: " + windSpeedinMph);
}
}
반응형
'학습일지 > 클라우드' 카테고리의 다른 글
[IBM Cloud 강의번역 프로젝트] - ch1-4. Docker Container Registry (0) | 2020.09.02 |
---|---|
[IBM Cloud 강의번역 프로젝트] - ch1-3. Building Container Images (0) | 2020.09.01 |
Architecting with Google Compute Engine - Scale Automation ch2 - Deployment Manager (0) | 2020.08.25 |
IBM Cloud - What is OpenShift? 정리 (0) | 2020.07.31 |
Architecting with Google Compute Engine - Scale Automation ch1 - Load balancing (0) | 2020.07.26 |