From a6ba135f7784450aff4e72043db4cd6d0539af30 Mon Sep 17 00:00:00 2001 From: iaforek Date: Fri, 7 Jul 2017 18:01:53 +0100 Subject: [PATCH] BAEL-579 Spring Cloud Bus (#2218) * Code for Dependency Injection Article. * Added Java based configuration. Downloaded formatter.xml and reformatted all changed files. Manually changed tab into 4 spaces in XML configuration files. * BAEL-434 - Spring Roo project files generated by Spring Roo. No formatting applied. Added POM, java and resources folders. * Moved project from roo to spring-roo folder. * BAEL-838 Initial code showing how to remove last char - helper class and tests. * BAEL-838 Corrected Helper class and associated empty string test case. Added StringUtils.substing tests. * BAEL-838 Refromatted code using formatter.xml. Added Assert.assertEquals import. Renamed test to follow convention. Reordered tests. * BAEL-838 - Added regex method and updated tests. * BAEL-838 Added new line examples. * BAEL-838 Renamed RemoveLastChar class to StringHelper and added Java8 examples. Refactord code. * BAEL-838 Changed method names * BAEL-838 Tiny change to keep code consistant. Return null or empty. * BAEL-838 Removed unresolved conflict. * BAEL-821 New class that shows different rounding techniques. Updated POM. * BAEL-821 - Added unit test for different round methods. * BAEL-821 Changed test method name to follow the convention * BAEL-821 Added more test and updated round methods. * BAEL-837 - initial commit. A few examples of adding doubles. * BAEL-837 - Couple of smaller changes * BAEL-837 - Added jUnit test. * BAEL-579 Updated Spring Cloud Version I was getting error: java.lang.NoSuchMethodError: org.springframework.cloud.config.environment.Environment After version update, all is okay. * BAEL-579 Added actuator to Cloud Config Client. * BAEL-579 Enabled cloud bus and updated dependencies. * BAEL-579 Config Client using Spring Cloud Bus. * BAEL-579 Recreated Basic Config Server. * BAEL-579 Recreated Config Client. * BAEL-579 Removed test Git URL. * BAEL-579 Added Actuator to Config Client * BAEL-579 Added Spring Cloud Bus to Client. * BAEL-579 Server changes for Spring Cloud Bus Added dependencies and removed git.clone-on-start as this was causing server to throw errors after git properties change. * BAEL-579 Removed Git URL. * Revert "BAEL-579 Updated Spring Cloud Version" This reverts commit f775bf91e53a1ecfb9b70596688d7c8202bf495f. * Revert "BAEL-579 Config Client using Spring Cloud Bus." This reverts commit 1d96bc5761994a33af9a7a9aa5ab68604a5b44dc. * Revert "BAEL-579 Enabled cloud bus and updated dependencies." This reverts commit 7845da922d89d53506dd0fff387ea13694c50bc1. * Revert "BAEL-579 Added actuator to Cloud Config Client." This reverts commit 076657a26a57e0aa676989a4d97966a3b9d53e1c. * BAEL-579 Added missing dependency versions. * BAEL-579 Added missing dependency versions. --- .../maths/FloatingPointArithmeticTest.java | 22 ++--- .../java/com/baeldung/maths/RoundTest.java | 84 +++++++++--------- .../spring-cloud-config-client/pom.xml | 81 +++++++++++++++++ .../SpringCloudConfigClientApplication.java | 32 +++++++ .../src/main/resources/application.yml | 7 ++ .../src/main/resources/bootstrap.properties | 7 ++ ...ringCloudConfigClientApplicationTests.java | 16 ++++ .../spring-cloud-config-server/pom.xml | 82 +++++++++++++++++ .../SpringCloudConfigServerApplication.java | 14 +++ .../src/main/resources/application.properties | 12 +++ .../src/main/resources/config-server.jks | Bin 0 -> 3842 bytes ...ringCloudConfigServerApplicationTests.java | 16 ++++ 12 files changed, 320 insertions(+), 53 deletions(-) create mode 100644 spring-cloud-bus/spring-cloud-config-client/pom.xml create mode 100644 spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java create mode 100644 spring-cloud-bus/spring-cloud-config-client/src/main/resources/application.yml create mode 100644 spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties create mode 100644 spring-cloud-bus/spring-cloud-config-client/src/test/java/com/baeldung/SpringCloudConfigClientApplicationTests.java create mode 100644 spring-cloud-bus/spring-cloud-config-server/pom.xml create mode 100644 spring-cloud-bus/spring-cloud-config-server/src/main/java/com/baeldung/SpringCloudConfigServerApplication.java create mode 100644 spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties create mode 100644 spring-cloud-bus/spring-cloud-config-server/src/main/resources/config-server.jks create mode 100644 spring-cloud-bus/spring-cloud-config-server/src/test/java/com/baeldung/SpringCloudConfigServerApplicationTests.java diff --git a/core-java/src/test/java/com/baeldung/maths/FloatingPointArithmeticTest.java b/core-java/src/test/java/com/baeldung/maths/FloatingPointArithmeticTest.java index 84dd41b1d7..2066f13c6d 100644 --- a/core-java/src/test/java/com/baeldung/maths/FloatingPointArithmeticTest.java +++ b/core-java/src/test/java/com/baeldung/maths/FloatingPointArithmeticTest.java @@ -1,10 +1,10 @@ package com.baeldung.maths; +import java.math.BigDecimal; + import org.junit.Assert; import org.junit.Test; -import java.math.BigDecimal; - public class FloatingPointArithmeticTest { @Test @@ -13,33 +13,33 @@ public class FloatingPointArithmeticTest { double b = 4.88; double c = 21.45; double result = 39.55; - + double abc = a + b + c; double acb = a + c + b; - + Assert.assertEquals(result, abc, 0); Assert.assertNotEquals(result, acb, 0); - + double ab = 18.1; double ac = 34.67; - + double ab_c = ab + c; double ac_b = ac + b; - + Assert.assertEquals(result, ab_c, 0); Assert.assertNotEquals(result, ac_b, 0); - + BigDecimal d = new BigDecimal(String.valueOf(a)); BigDecimal e = new BigDecimal(String.valueOf(b)); BigDecimal f = new BigDecimal(String.valueOf(c)); BigDecimal sum = new BigDecimal("39.55"); - + BigDecimal def = d.add(e).add(f); BigDecimal dfe = d.add(f).add(e); - + Assert.assertEquals(0, def.compareTo(sum)); Assert.assertEquals(0, dfe.compareTo(sum)); - + Assert.assertNotEquals(0, sum.compareTo(new BigDecimal(String.valueOf(acb)))); } } diff --git a/core-java/src/test/java/com/baeldung/maths/RoundTest.java b/core-java/src/test/java/com/baeldung/maths/RoundTest.java index ead21265c0..5ce9523e21 100644 --- a/core-java/src/test/java/com/baeldung/maths/RoundTest.java +++ b/core-java/src/test/java/com/baeldung/maths/RoundTest.java @@ -15,60 +15,60 @@ public class RoundTest { private double expected = 2.03d; @Test - public void givenDecimalNumber_whenRoundToNDecimalPlaces_thenGetExpectedResult() { - assertEquals(expected, Round.round(value, places), delta); - assertEquals(expected, Round.roundNotPrecise(value, places), delta); - assertEquals(expected, Round.roundAvoid(value, places), delta); - assertEquals(expected, Precision.round(value, places), delta); - assertEquals(expected, DoubleRounder.round(value, places), delta); - + public void givenDecimalNumber_whenRoundToNDecimalPlaces_thenGetExpectedResult() { + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertEquals(expected, Round.roundNotPrecise(value, places), delta); + Assert.assertEquals(expected, Round.roundAvoid(value, places), delta); + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertEquals(expected, DoubleRounder.round(value, places), delta); + places = 3; expected = 2.035d; - - assertEquals(expected, Round.round(value, places), delta); - assertEquals(expected, Round.roundNotPrecise(value, places), delta); - assertEquals(expected, Round.roundAvoid(value, places), delta); - assertEquals(expected, Precision.round(value, places), delta); - assertEquals(expected, DoubleRounder.round(value, places), delta); - + + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertEquals(expected, Round.roundNotPrecise(value, places), delta); + Assert.assertEquals(expected, Round.roundAvoid(value, places), delta); + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertEquals(expected, DoubleRounder.round(value, places), delta); + value = 1000.0d; places = 17; expected = 1000.0d; - - assertEquals(expected, Round.round(value, places), delta); - assertEquals(expected, Round.roundNotPrecise(value, places), delta); - assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 92.23372036854776 ! - assertEquals(expected, Precision.round(value, places), delta); - assertEquals(expected, DoubleRounder.round(value, places), delta); - + + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertEquals(expected, Round.roundNotPrecise(value, places), delta); + Assert.assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 92.23372036854776 ! + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertEquals(expected, DoubleRounder.round(value, places), delta); + value = 256.025d; places = 2; expected = 256.03d; - - assertEquals(expected, Round.round(value, places), delta); - assertNotEquals(expected, Round.roundNotPrecise(value, places), delta); // Returns: 256.02 ! - assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 256.02 ! - assertEquals(expected, Precision.round(value, places), delta); - assertNotEquals(expected, DoubleRounder.round(value, places), delta); // Returns: 256.02 ! - - value = 260.775d; + + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertNotEquals(expected, Round.roundNotPrecise(value, places), delta); // Returns: 256.02 ! + Assert.assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 256.02 ! + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertNotEquals(expected, DoubleRounder.round(value, places), delta); // Returns: 256.02 ! + + value = 260.775d; places = 2; expected = 260.78d; - - assertEquals(expected, Round.round(value, places), delta); - assertNotEquals(expected, Round.roundNotPrecise(value, places), delta); // Returns: 260.77 ! - assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 260.77 ! - assertEquals(expected, Precision.round(value, places), delta); - assertNotEquals(expected, DoubleRounder.round(value, places), delta); // Returns: 260.77 ! - + + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertNotEquals(expected, Round.roundNotPrecise(value, places), delta); // Returns: 260.77 ! + Assert.assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 260.77 ! + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertNotEquals(expected, DoubleRounder.round(value, places), delta); // Returns: 260.77 ! + value = 90080070060.1d; places = 9; expected = 90080070060.1d; - - assertEquals(expected, Round.round(value, places), delta); - assertEquals(expected, Round.roundNotPrecise(value, places), delta); - assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 9.223372036854776E9 ! - assertEquals(expected, Precision.round(value, places), delta); - assertEquals(expected, DoubleRounder.round(value, places), delta); + + Assert.assertEquals(expected, Round.round(value, places), delta); + Assert.assertEquals(expected, Round.roundNotPrecise(value, places), delta); + Assert.assertNotEquals(expected, Round.roundAvoid(value, places), delta); // Returns: 9.223372036854776E9 ! + Assert.assertEquals(expected, Precision.round(value, places), delta); + Assert.assertEquals(expected, DoubleRounder.round(value, places), delta); } } diff --git a/spring-cloud-bus/spring-cloud-config-client/pom.xml b/spring-cloud-bus/spring-cloud-config-client/pom.xml new file mode 100644 index 0000000000..977f18b17f --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-client/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-config-client + 0.0.1-SNAPSHOT + jar + + spring-cloud-config-client + Demo Spring Cloud Config Client + + + org.springframework.boot + spring-boot-starter-parent + 1.5.4.RELEASE + + + + UTF-8 + UTF-8 + 1.8 + Dalston.SR1 + + + + + org.springframework.cloud + spring-cloud-starter-config + 1.3.1.RELEASE + + + org.springframework.boot + spring-boot-starter-web + 1.5.4.RELEASE + + + + org.springframework.boot + spring-boot-starter-test + 1.5.4.RELEASE + test + + + + org.springframework.boot + spring-boot-actuator + 1.5.4.RELEASE + + + + org.springframework.cloud + spring-cloud-starter-bus-amqp + 1.3.1.RELEASE + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.4.RELEASE + + + + + diff --git a/spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java b/spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java new file mode 100644 index 0000000000..d0afd7f6bf --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-client/src/main/java/com/baeldung/SpringCloudConfigClientApplication.java @@ -0,0 +1,32 @@ +package com.baeldung; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +@RefreshScope +public class SpringCloudConfigClientApplication { + + @Value("${user.role}") + private String role; + + @Value("${user.password}") + private String password; + + public static void main(String[] args) { + SpringApplication.run(SpringCloudConfigClientApplication.class, args); + } + + @RequestMapping(value = "/whoami/{username}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) + public String whoami(@PathVariable("username") String username) { + return String.format("Hello %s! You are a(n) %s and your password is '%s'.\n", username, role, password); + } +} diff --git a/spring-cloud-bus/spring-cloud-config-client/src/main/resources/application.yml b/spring-cloud-bus/spring-cloud-config-client/src/main/resources/application.yml new file mode 100644 index 0000000000..547e0284f3 --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-client/src/main/resources/application.yml @@ -0,0 +1,7 @@ +--- +spring: + rabbitmq: + host: localhost + port: 5672 + username: guest + password: guest \ No newline at end of file diff --git a/spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties b/spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties new file mode 100644 index 0000000000..7b362614ba --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-client/src/main/resources/bootstrap.properties @@ -0,0 +1,7 @@ +spring.application.name=config-client +spring.profiles.active=development +spring.cloud.config.uri=http://localhost:8888 +spring.cloud.config.username=root +spring.cloud.config.password=s3cr3t +spring.cloud.config.fail-fast=true +management.security.enabled=false \ No newline at end of file diff --git a/spring-cloud-bus/spring-cloud-config-client/src/test/java/com/baeldung/SpringCloudConfigClientApplicationTests.java b/spring-cloud-bus/spring-cloud-config-client/src/test/java/com/baeldung/SpringCloudConfigClientApplicationTests.java new file mode 100644 index 0000000000..3b361f385a --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-client/src/test/java/com/baeldung/SpringCloudConfigClientApplicationTests.java @@ -0,0 +1,16 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringCloudConfigClientApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-cloud-bus/spring-cloud-config-server/pom.xml b/spring-cloud-bus/spring-cloud-config-server/pom.xml new file mode 100644 index 0000000000..e37f601d2c --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-server/pom.xml @@ -0,0 +1,82 @@ + + + 4.0.0 + + com.baeldung.spring.cloud + spring-cloud-config-server + 0.0.1-SNAPSHOT + jar + + spring-cloud-config-server + Demo Spring Cloud Config Server + + + org.springframework.boot + spring-boot-starter-parent + 1.5.4.RELEASE + + + + UTF-8 + UTF-8 + 1.8 + Dalston.SR1 + + + + + org.springframework.cloud + spring-cloud-config-server + 1.3.1.RELEASE + + + + org.springframework.boot + spring-boot-starter-security + 1.5.4.RELEASE + + + + org.springframework.boot + spring-boot-starter-test + 1.5.4.RELEASE + test + + + + org.springframework.cloud + spring-cloud-config-monitor + 1.3.1.RELEASE + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + 1.2.1.RELEASE + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.4.RELEASE + + + + + diff --git a/spring-cloud-bus/spring-cloud-config-server/src/main/java/com/baeldung/SpringCloudConfigServerApplication.java b/spring-cloud-bus/spring-cloud-config-server/src/main/java/com/baeldung/SpringCloudConfigServerApplication.java new file mode 100644 index 0000000000..4feace7c89 --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-server/src/main/java/com/baeldung/SpringCloudConfigServerApplication.java @@ -0,0 +1,14 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.config.server.EnableConfigServer; + +@SpringBootApplication +@EnableConfigServer +public class SpringCloudConfigServerApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringCloudConfigServerApplication.class, args); + } +} diff --git a/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties new file mode 100644 index 0000000000..4c18c192c0 --- /dev/null +++ b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/application.properties @@ -0,0 +1,12 @@ +server.port=8888 +spring.cloud.config.server.git.uri= +security.user.name=root +security.user.password=s3cr3t +encrypt.key-store.location=classpath:/config-server.jks +encrypt.key-store.password=my-s70r3-s3cr3t +encrypt.key-store.alias=config-server-key +encrypt.key-store.secret=my-k34-s3cr3t +spring.rabbitmq.host=localhost +spring.rabbitmq.port=5672 +spring.rabbitmq.username=guest +spring.rabbitmq.password=guest \ No newline at end of file diff --git a/spring-cloud-bus/spring-cloud-config-server/src/main/resources/config-server.jks b/spring-cloud-bus/spring-cloud-config-server/src/main/resources/config-server.jks new file mode 100644 index 0000000000000000000000000000000000000000..f3dddb4a8f4c4773a8feae4d8534b129e5e67f45 GIT binary patch literal 3842 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