Slide 1

Slide 1 text

Spring on Google Cloud Platform

Slide 2

Slide 2 text

2 @saturnism @gcpcloud Ray Tsang Developer Advocate Google Cloud Platform @saturnism saturnism.me

Slide 3

Slide 3 text

3 @saturnism @gcpcloud Compute Big Data BigQuery Cloud Dataflow Cloud Dataproc Cloud Datalab Cloud Pub/Sub Genomics Storage & Databases Cloud Storage Cloud Bigtable Cloud Datastore Cloud SQL Cloud Spanner Persistent Disk Machine Learning Cloud Machine Learning Cloud Vision API Cloud Speech API Cloud Natural Language API Cloud Translation API Cloud Jobs API Data Studio Cloud Dataprep Cloud Video Intelligence API Advanced Solutions Lab Compute Engine App Engine Kubernetes Engine GPU Cloud Functions Container- Optimized OS Identity & Security Cloud IAM Cloud Resource Manager Cloud Security Scanner Key Management Service BeyondCorp Data Loss Prevention API Identity-Aware Proxy Security Key Enforcement Data Transfer Appliance

Slide 4

Slide 4 text

4 @saturnism @gcpcloud Amazing Technology!

Slide 5

Slide 5 text

5 @saturnism @gcpcloud Use Spring on Google Cloud Platform as easily and seamlessly as possible

Slide 6

Slide 6 text

6 @saturnism @gcpcloud Framework IDE and Tooling Deployment Monitoring/Diagnostics

Slide 7

Slide 7 text

7 @saturnism @gcpcloud Goals Provide integration between GCP services and Spring Meet developers where they are Cut down on boilerplate code +

Slide 8

Slide 8 text

8 @saturnism @gcpcloud Collaboration with Pivotal Developed GitHub in the spring-cloud-gcp repository under the Spring Cloud organization owned by Pivotal. Close collaboration between Google and Pivotal engineers.

Slide 9

Slide 9 text

9 @saturnism @gcpcloud Feature GCP Service Spring Framework Configuration Cloud Runtime Config Spring Cloud Config Messaging Cloud Pub/Sub Spring Integration Spring Cloud Stream Spring Dataflow Database Cloud SQL Cloud Spanner Spring Data Spring Data Spanner Storage Cloud Storage Spring Resource Logging Stackdriver Logging Logback Trace Stackdriver Trace Spring Cloud Sleuth Spring Boot Starters for...

Slide 10

Slide 10 text

10 @saturnism @gcpcloud

Slide 11

Slide 11 text

11 @saturnism @gcpcloud org.springframework.cloud spring-cloud-gcp-dependencies ${spring-cloud-gcp.version} pom import

Slide 12

Slide 12 text

12 @saturnism @gcpcloud Cloud SQL database Spring Boot App

Slide 13

Slide 13 text

13 @saturnism @gcpcloud Cloud SQL Managed MySQL and PostgreSQL Scale out with read replicas High availability (HA) option Per-minute billing Instance sizes to fit any budget Granular access control using IAM roles

Slide 14

Slide 14 text

14 @saturnism @gcpcloud pom.xml org.springframework.cloud spring-cloud-gcp-starter-sql-mysql application.properties spring.cloud.gcp.sql.instance-connection-name=my-gcp-project:us-central1:petclinic spring.cloud.gcp.sql.database-name=petclinic_db Configures Datasource, JDBC URL, Certificates Establishes secured connections

Slide 15

Slide 15 text

15 @saturnism @gcpcloud Message Processor Processor 2 Processor N ... Google Cloud Pub/Sub Google Cloud SQL database Spring Boot app

Slide 16

Slide 16 text

16 @saturnism @gcpcloud Managed Global Messaging Middleware Capture, pass messages across services At-least- once delivery semantics Configurable message retention policies Push/Pull message delivery patterns Cloud Pub/Sub

Slide 17

Slide 17 text

17 @saturnism @gcpcloud

Slide 18

Slide 18 text

18 @saturnism @gcpcloud pom.xml org.springframework.cloud spring-cloud-gcp-starter-pubsub Code @Autowired PubSubTemplate pubSubTemplate; public void hello(String name) { pubSubTemplate.publish("my-topic", name + " said Hi"); }

Slide 19

Slide 19 text

19 @saturnism @gcpcloud

Slide 20

Slide 20 text

20 @saturnism @gcpcloud Code pubSubTemplate.subscribe("processors", (msg, ackReply) -> { log.info(msg.getData().toStringUtf8()); ackReply.ack(); });

Slide 21

Slide 21 text

21 @saturnism @gcpcloud Also Integrated Pub/Sub with... Spring Framework Use Case Spring Integration Enterprise Integration Pattern Middleware-Agnostic Code Spring Cloud Stream Event-driven Microservices Reactive Programming Middleware-Agnostic Code

Slide 22

Slide 22 text

22 @saturnism @gcpcloud Scalable mission-critical RDBMS Relational semantics Schemas, ACID transactions, SQL query Scale horizontally Automatic, synchronous replication 99.999% Availability Cloud Spanner

Slide 23

Slide 23 text

23 @saturnism @gcpcloud pom.xml org.springframework.cloud spring-cloud-gcp-starter-data-spanner< Code @Table public class Person { @PrimaryKey private long id; private String id; ... }

Slide 24

Slide 24 text

24 @saturnism @gcpcloud Code @RepositoryRestResource public interface PersonRestRepository extends SpannerRepository { public List findPersonByName(String name); @Query("SELECT * FROM person WHERE ...") public List findPersonWithQuery(String location); }

Slide 25

Slide 25 text

25 @saturnism @gcpcloud Observability, Correlated Logs with Sleuth and Logback

Slide 26

Slide 26 text

26 @saturnism @gcpcloud pom.xml org.springframework.cloud spring-cloud-gcp-starter-logging org.springframework.cloud spring-cloud-gcp-starter-trace

Slide 27

Slide 27 text

27 @saturnism @gcpcloud Log Appender Direct to Stackdriver Logging Or, Output as XML

Slide 28

Slide 28 text

28 @saturnism @gcpcloud

Slide 29

Slide 29 text

29 @saturnism @gcpcloud

Slide 30

Slide 30 text

30 @saturnism @gcpcloud

Slide 31

Slide 31 text

31 @saturnism @gcpcloud Feature GCP Service Spring Framework Configuration Cloud Runtime Config Spring Cloud Config Messaging Cloud Pub/Sub Spring Integration Spring Cloud Stream Spring Dataflow Database Cloud SQL Cloud Spanner Spring Data Spring Data Spanner Storage Cloud Storage Spring Resource Logging Stackdriver Logging Logback Trace Stackdriver Trace Spring Cloud Sleuth Spring Boot Starters for...

Slide 32

Slide 32 text

32 @saturnism @gcpcloud IntelliJ and Eclipse Plugins Maven and Gradle Plugins

Slide 33

Slide 33 text

33 @saturnism @gcpcloud

Slide 34

Slide 34 text

34 @saturnism @gcpcloud

Slide 35

Slide 35 text

35 @saturnism @gcpcloud Automatically adds dependencies to POM

Slide 36

Slide 36 text

36 @saturnism @gcpcloud pom.xml com.google.cloud google-cloud-vision Code @Bean public ImageAnnotatorClient imageAnnotatorClient( CredentialsProvider credentialsProvider) throws IOException { ImageAnnotatorSettings clientSettings = ImageAnnotatorSettings.newBuilder() .setCredentialsProvider(credentialsProvider) .build(); return ImageAnnotatorClient.create(clientSettings); }

Slide 37

Slide 37 text

37 @saturnism @gcpcloud App Engine Standard Kubernetes Engine Compute Engine

Slide 38

Slide 38 text

38 @saturnism @gcpcloud

Slide 39

Slide 39 text

39 @saturnism @gcpcloud pom.xml com.google.cloud.tools appengine-maven-plugin 1.3.1 Deploy $ mvn appengine:deploy

Slide 40

Slide 40 text

40 @saturnism @gcpcloud Jib - building container images https://github.com/GoogleContainerTools/jib Fast - Automatically split application into layers based on application dependency. Reproducible - Rebuilding your container image with the same contents always generates the same image. Daemonless - Reduce CLI dependencies. Build container image from within Maven or Gradle and push to any registry of your choice. No more writing Dockerfiles and calling docker build/push. Small - Uses Google's Distroless base image,

Slide 41

Slide 41 text

41 @saturnism @gcpcloud pom.xml com.google.cloud.tools jib-maven-plugin ... my-spring-app Deploy $ mvn compile jib:build

Slide 42

Slide 42 text

42 @saturnism @gcpcloud Pivotal Cloud Foundry Support

Slide 43

Slide 43 text

43 @saturnism @gcpcloud Pivotal Cloud Foundry Support Native - Google and Pivotal engineers built support for PCF on GCP. Use things like global load balancing and pre-emptible VMs to scale applications or reduce cost. Integrated - The GCP Service Broker lets developers provision and use Google services in their apps without manually creating and managing resources in the console. Observable - Stackdriver debugging, monitoring, and logging make it easy to observe your Spring applications deployed to PCF on GCP.

Slide 44

Slide 44 text

44 @saturnism @gcpcloud GCP Service Broker for Cloud Foundry VIRTUAL NETWORK LOAD BALANCING CDN DNS INTERCONNECT Management Compute Storage Networking Data Machine Learning STACKDRIVER IDENTITY AND ACCESS MANAGEMENT CLOUD ML SPEECH API VISION API TRANSLATE API 44 NATURAL LANGUAGE API

Slide 45

Slide 45 text

45 @saturnism @gcpcloud cf create-service SERVICE PLAN SERVICE_INSTANCE [-c PARAMETERS_AS_JSON] [-t TAGS] # generated topic name, no subscription $ cf create-service pubsub default orders # generated topic name, with a subscription $ cf create-service pubsub default orders -c \ '{"topic-name": "orders", "subscription-name": "accounting"}' cf bind-service APP_NAME SERVICE_INSTANCE [-c PARAMETERS_AS_JSON] [--binding-name BINDING_NAME] $ cf bind-service accounting-database orders -c '{"role": "pubsub.subscriber"}' $ cf bind-service website orders -c '{"role": "pubsub.publisher"}'

Slide 46

Slide 46 text

46 @saturnism @gcpcloud Spring Cloud GCP Automatically Discovers VCAP_SERVICES Environment Variable Configures Credentials

Slide 47

Slide 47 text

47 @saturnism @gcpcloud Prometheus Monitoring with Stackdriver

Slide 48

Slide 48 text

48 @saturnism @gcpcloud pom.xml org.springframework.boot spring-boot-starter-actuator io.micrometer micrometer-registry-prometheus runtime Prometheus Endpoint $ curl http://localhost:8080/actuator/prometheus

Slide 49

Slide 49 text

49 @saturnism @gcpcloud jvm_gc_max_data_size_bytes 8.9653248E7 tomcat_global_request_seconds_count{name="http-nio-8080",} 322145.0 tomcat_global_request_seconds_sum{name="http-nio-8080",} 748.139 process_uptime_seconds 26874.681 tomcat_global_error_total{name="http-nio-8080",} 1.0 jvm_buffer_memory_used_bytes{id="direct",} 294913.0 jvm_buffer_memory_used_bytes{id="mapped",} 0.0 tomcat_servlet_request_max_seconds{name="default",} 0.0 system_cpu_usage 0.06456190138346932 process_files_max 1048576.0 http_server_requests_seconds_count{exception="None",method="GET",status="200",uri="/**",} 322111.0 http_server_requests_seconds_sum{exception="None",method="GET",status="200",uri="/**",} 527.459778932 http_server_requests_seconds_count{exception="None",method="GET",status="404",uri="/webjars/**",} 1.0 http_server_requests_seconds_sum{exception="None",method="GET",status="404",uri="/webjars/**",} 0.026788256 http_server_requests_seconds_count{exception="None",method="GET",status="304",uri="/**",} 33.0 http_server_requests_seconds_sum{exception="None",method="GET",status="304",uri="/**",} 0.171848745 http_server_requests_seconds_count{exception="None",method="GET",status="200",uri="/api/gateway/owners/{ownerId}",} 3.0 http_server_requests_seconds_sum{exception="None",method="GET",status="200",uri="/api/gateway/owners/{ownerId}",} 1.247613785 http_server_requests_seconds_max{exception="None",method="GET",status="200",uri="/**",} 0.073825406 http_server_requests_seconds_max{exception="None",method="GET",status="404",uri="/webjars/**",} 0.0 http_server_requests_seconds_max{exception="None",method="GET",status="304",uri="/**",} 0.0 http_server_requests_seconds_max{exception="None",method="GET",status="200",uri="/api/gateway/owners/{ownerId}",} 0.0 system_cpu_count 2.0 tomcat_threads_busy{name="http-nio-8080",} 0.0 tomcat_sessions_active_max 0.0 jvm_threads_live 69.0 tomcat_servlet_request_seconds_count{name="default",} 0.0 tomcat_servlet_request_seconds_sum{name="default",} 0.0 jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 4.2205184E7 jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 7.3269248E7 jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 8781824.0 jvm_memory_committed_bytes{area="heap",id="PS Eden Space",} 4.0370176E7 jvm_memory_committed_bytes{area="heap",id="PS Survivor Space",} 2097152.0 jvm_memory_committed_bytes{area="heap",id="PS Old Gen",} 6.029312E7 jvm_memory_max_bytes{area="nonheap",id="Code Cache",} 2.5165824E8 jvm_memory_max_bytes{area="nonheap",id="Metaspace",} -1.0 jvm_memory_max_bytes{area="nonheap",id="Compressed Class Space",} 1.073741824E9 jvm_memory_max_bytes{area="heap",id="PS Eden Space",} 4.0370176E7 jvm_memory_max_bytes{area="heap",id="PS Survivor Space",} 2097152.0 jvm_memory_max_bytes{area="heap",id="PS Old Gen",} 8.9653248E7 ...

Slide 50

Slide 50 text

50 @saturnism @gcpcloud

Slide 51

Slide 51 text

51 @saturnism @gcpcloud

Slide 52

Slide 52 text

52 @saturnism @gcpcloud Production Debugging and Profiling

Slide 53

Slide 53 text

53 @saturnism @gcpcloud Download the Agents Add to Startup Command Line: For Profiler: $ java -agentpath:/opt/profiler/profiler_java_agent.so=... -jar myapp.jar For Debugger: $ java -agentpath:/opt/debugger/cdbg_java_agent.so -jar myapp.jar

Slide 54

Slide 54 text

54 @saturnism @gcpcloud What's taking most CPU time?

Slide 55

Slide 55 text

55 @saturnism @gcpcloud

Slide 56

Slide 56 text

56 @saturnism @gcpcloud Forgot a Log Message?

Slide 57

Slide 57 text

57 @saturnism @gcpcloud

Slide 58

Slide 58 text

58 @saturnism @gcpcloud

Slide 59

Slide 59 text

59 @saturnism @gcpcloud Debug Production Code, Live!

Slide 60

Slide 60 text

60 @saturnism @gcpcloud

Slide 61

Slide 61 text

61 @saturnism @gcpcloud

Slide 62

Slide 62 text

62 @saturnism @gcpcloud

Slide 63

Slide 63 text

63 @saturnism @gcpcloud

Slide 64

Slide 64 text

64 @saturnism @gcpcloud PCF Buildpack with GCP Service Broker Automatically adds Debugger Agent on `cf push`!

Slide 65

Slide 65 text

65 @saturnism @gcpcloud Framework - Spring Boot Support IDE and Tooling - IntelliJ, Eclipse, Maven, Gradle Deployment - Container, App Engine, PCF, ... Monitoring/Diagnostics - Debug, Profile, Logging, Error Reporting, Prometheus Monitoring, ... End-to-end Developer Experience

Slide 66

Slide 66 text

66 @saturnism @gcpcloud Project Home https://cloud.spring.io/spring-cloud-gcp/ Documentation https://docs.spring.io/spring-cloud-gcp/docs/ Source and Samples https://github.com/spring-cloud/spring-cloud-gcp/ Short Code Labs http://g.co/codelabs/spring Long Code Lab http://bit.ly/spring-gcp-lab Recorded Conference Talks ○ Power of Google Cloud Platform with Spring Cloud GCP ○ Cloud Native with Spring Boot on Google Cloud Platform

Slide 67

Slide 67 text

Thanks! cloud.spring.io/spring-cloud-gcp http://bit.ly/spring-gcp-lab @saturnism