diff --git a/springcloud/第三篇所用代码/confsvr/pom.xml b/springcloud/第三篇所用代码/confsvr/pom.xml
new file mode 100644
index 0000000..de9e7df
--- /dev/null
+++ b/springcloud/第三篇所用代码/confsvr/pom.xml
@@ -0,0 +1,65 @@
+
+
+ 4.0.0
+
+ com.fxb
+ demo
+ 0.0.1-SNAPSHOT
+ jar
+
+ confsvr
+ Demo project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.4.4.RELEASE
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ Camden.SR5
+ pom
+ import
+
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ Camden.SR5
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-config-server
+
+
+ org.springframework.cloud
+ spring-cloud-starter-config
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/springcloud/第三篇所用代码/confsvr/src/main/java/com/fxb/demo/ConfsvrApplication.java b/springcloud/第三篇所用代码/confsvr/src/main/java/com/fxb/demo/ConfsvrApplication.java
new file mode 100644
index 0000000..b0f9afd
--- /dev/null
+++ b/springcloud/第三篇所用代码/confsvr/src/main/java/com/fxb/demo/ConfsvrApplication.java
@@ -0,0 +1,14 @@
+package com.fxb.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.config.server.EnableConfigServer;
+
+@SpringBootApplication
+@EnableConfigServer
+public class ConfsvrApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ConfsvrApplication.class, args);
+ }
+}
diff --git a/springcloud/第三篇所用代码/confsvr/src/main/resources/application.yml b/springcloud/第三篇所用代码/confsvr/src/main/resources/application.yml
new file mode 100644
index 0000000..b980353
--- /dev/null
+++ b/springcloud/第三篇所用代码/confsvr/src/main/resources/application.yml
@@ -0,0 +1,25 @@
+server:
+ port: 8888
+
+spring:
+ profiles:
+ # 使用文件系统来存储配置信息,需要设置为native,git设置为git
+ active: git
+ application:
+ name: test
+ cloud:
+ config:
+ server:
+ native:
+ # 使用文件来存放配置文件,为每个应用程序提供用逗号分隔的文件夹列表
+ searchLocations: file:///D:/configFolder/licensingservice
+ git:
+ uri: https://github.com/FleyX/demo-project
+ # 查找配置文件路径(,分隔)
+ search-paths: springcloud/config/licensingservice
+ #如果为公开仓库,用户名密码可不填写
+ username:
+ password:
+ #配置git仓库的分支
+ label: master
+
diff --git a/springcloud/第三篇所用代码/confsvr/src/test/java/com/fxb/demo/ConfsvrApplicationTests.java b/springcloud/第三篇所用代码/confsvr/src/test/java/com/fxb/demo/ConfsvrApplicationTests.java
new file mode 100644
index 0000000..3096743
--- /dev/null
+++ b/springcloud/第三篇所用代码/confsvr/src/test/java/com/fxb/demo/ConfsvrApplicationTests.java
@@ -0,0 +1,16 @@
+package com.fxb.demo;
+
+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 ConfsvrApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
diff --git a/springcloud/第三篇所用代码/eurekasvr/pom.xml b/springcloud/第三篇所用代码/eurekasvr/pom.xml
new file mode 100644
index 0000000..5337b2a
--- /dev/null
+++ b/springcloud/第三篇所用代码/eurekasvr/pom.xml
@@ -0,0 +1,72 @@
+
+
+ 4.0.0
+
+ com.fxb
+ eurekasvr
+ 0.0.1-SNAPSHOT
+ jar
+
+ eurekasvr
+ Demo project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.4.4.RELEASE
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ Camden.SR5
+ pom
+ import
+
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ Camden.SR5
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka-server
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
+ spring-milestones
+ Spring Milestones
+ https://repo.spring.io/milestone
+
+ false
+
+
+
+
+
+
diff --git a/springcloud/第三篇所用代码/eurekasvr/src/main/java/com/fxb/eurekasvr/EurekasvrApplication.java b/springcloud/第三篇所用代码/eurekasvr/src/main/java/com/fxb/eurekasvr/EurekasvrApplication.java
new file mode 100644
index 0000000..0ee3302
--- /dev/null
+++ b/springcloud/第三篇所用代码/eurekasvr/src/main/java/com/fxb/eurekasvr/EurekasvrApplication.java
@@ -0,0 +1,14 @@
+package com.fxb.eurekasvr;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
+
+@SpringBootApplication
+@EnableEurekaServer
+public class EurekasvrApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(EurekasvrApplication.class, args);
+ }
+}
diff --git a/springcloud/第三篇所用代码/eurekasvr/src/main/resources/application.yml b/springcloud/第三篇所用代码/eurekasvr/src/main/resources/application.yml
new file mode 100644
index 0000000..12cd213
--- /dev/null
+++ b/springcloud/第三篇所用代码/eurekasvr/src/main/resources/application.yml
@@ -0,0 +1,12 @@
+server:
+ port: 8761
+
+eureka:
+ client:
+ #不注册自己
+ register-with-eureka: false
+ #不在本地缓存注册表信息
+ fetch-registry: false
+ server:
+ #接受请求前的等待实际,开发模式下不要开启
+ #wait-time-in-ms-when-sync-empty: 5
diff --git a/springcloud/第三篇所用代码/eurekasvr/src/test/java/com/fxb/eurekasvr/EurekasvrApplicationTests.java b/springcloud/第三篇所用代码/eurekasvr/src/test/java/com/fxb/eurekasvr/EurekasvrApplicationTests.java
new file mode 100644
index 0000000..3d21ad6
--- /dev/null
+++ b/springcloud/第三篇所用代码/eurekasvr/src/test/java/com/fxb/eurekasvr/EurekasvrApplicationTests.java
@@ -0,0 +1,16 @@
+package com.fxb.eurekasvr;
+
+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 EurekasvrApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
diff --git a/springcloud/第三篇所用代码/licensingservice/pom.xml b/springcloud/第三篇所用代码/licensingservice/pom.xml
new file mode 100644
index 0000000..1588d1a
--- /dev/null
+++ b/springcloud/第三篇所用代码/licensingservice/pom.xml
@@ -0,0 +1,81 @@
+
+
+ 4.0.0
+
+ com.fxb
+ licensingservice
+ 0.0.1-SNAPSHOT
+ jar
+
+ licensingservice
+ Demo project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.4.4.RELEASE
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ Camden.SR5
+ pom
+ import
+
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ Camden.SR5
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka
+
+
+ org.springframework.cloud
+ spring-cloud-config-client
+
+
+ org.springframework.cloud
+ spring-cloud-starter-feign
+
+
+ org.springframework.cloud
+ spring-cloud-starter-hystrix
+
+
+
+ com.netflix.hystrix
+ hystrix-javanica
+ 1.5.9
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Licensing.java b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Licensing.java
new file mode 100644
index 0000000..f5c5d3b
--- /dev/null
+++ b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Licensing.java
@@ -0,0 +1,31 @@
+package com.fxb.licensingservice.Entity;
+
+import java.io.Serializable;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2018/11/22 19:52
+ */
+public class Licensing implements Serializable {
+ private Organization organization;
+ private boolean isValid;
+
+ public Organization getOrganization() {
+ return organization;
+ }
+
+ public void setOrganization(Organization organization) {
+ this.organization = organization;
+ }
+
+ public boolean isValid() {
+ return isValid;
+ }
+
+ public void setValid(boolean valid) {
+ isValid = valid;
+ }
+}
diff --git a/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Organization.java b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Organization.java
new file mode 100644
index 0000000..357bfa3
--- /dev/null
+++ b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/Entity/Organization.java
@@ -0,0 +1,40 @@
+package com.fxb.licensingservice.Entity;
+
+import java.io.Serializable;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2018/11/22 19:30
+ */
+public class Organization implements Serializable {
+
+ private String id;
+ private String name;
+
+ public Organization() {
+ }
+
+ public Organization(String id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/LicensingserviceApplication.java b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/LicensingserviceApplication.java
new file mode 100644
index 0000000..bb3a3f4
--- /dev/null
+++ b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/LicensingserviceApplication.java
@@ -0,0 +1,30 @@
+package com.fxb.licensingservice;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.client.RestTemplate;
+
+@SpringBootApplication
+@EnableDiscoveryClient //使用不带Ribbon功能的Spring RestTemplate,其他情况下可删除
+@EnableFeignClients //使用Feign客户端进行服务调用,其他情况下可删除
+@EnableCircuitBreaker //告诉Spring Cloud将要使用Hystrix
+public class LicensingserviceApplication {
+
+ /**
+ * 使用带有Ribbon 功能的Spring RestTemplate,其他情况可删除
+ */
+ @LoadBalanced
+ @Bean
+ public RestTemplate getRestTemplate(){
+ return new RestTemplate();
+ }
+
+ public static void main(String[] args) {
+ SpringApplication.run(LicensingserviceApplication.class, args);
+ }
+}
diff --git a/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/client/OrganizationFeignClient.java b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/client/OrganizationFeignClient.java
new file mode 100644
index 0000000..6e92dd9
--- /dev/null
+++ b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/client/OrganizationFeignClient.java
@@ -0,0 +1,32 @@
+package com.fxb.licensingservice.client;
+
+import com.fxb.licensingservice.Entity.Organization;
+import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
+import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2018/11/23 17:24
+ */
+@FeignClient(name="organizationservice",fallback = OrganizationFeignClientImpl.class)//使用FeignClient注解指定目标服务
+public interface OrganizationFeignClient {
+
+ /**
+ * 获取组织信息
+ *
+ * @param orgId 组织id
+ * @return Organization
+ */
+ @HystrixCommand(commandProperties = {
+ @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")
+ })
+ @RequestMapping(method = RequestMethod.GET, value = "/organization/{orgId}", consumes = "application/json")
+ Organization getOrganization(@PathVariable("orgId") String orgId);
+}
diff --git a/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/client/OrganizationFeignClientImpl.java b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/client/OrganizationFeignClientImpl.java
new file mode 100644
index 0000000..540d36b
--- /dev/null
+++ b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/client/OrganizationFeignClientImpl.java
@@ -0,0 +1,23 @@
+package com.fxb.licensingservice.client;
+
+import com.fxb.licensingservice.Entity.Organization;
+import org.springframework.stereotype.Component;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2018/12/7 11:30
+ */
+@Component
+public class OrganizationFeignClientImpl implements OrganizationFeignClient{
+
+ @Override
+ public Organization getOrganization(String orgId) {
+ Organization organization=new Organization();
+ organization.setId("0");
+ organization.setName("后备模式返回的数据");
+ return organization;
+ }
+}
diff --git a/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/controller/LicensingController.java b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/controller/LicensingController.java
new file mode 100644
index 0000000..85dea2f
--- /dev/null
+++ b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/controller/LicensingController.java
@@ -0,0 +1,56 @@
+package com.fxb.licensingservice.controller;
+
+import com.fxb.licensingservice.Entity.Licensing;
+import com.fxb.licensingservice.client.OrganizationFeignClient;
+import com.fxb.licensingservice.service.OrganizationByRibbonService;
+import com.fxb.licensingservice.service.OrganizationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2018/11/22 19:51
+ */
+@RestController
+public class LicensingController {
+
+ private OrganizationService organizationService;
+ private OrganizationByRibbonService ribbonService;
+ private OrganizationFeignClient organizationFeignClient;
+
+ @Autowired
+ public LicensingController(OrganizationService organizationService, OrganizationByRibbonService ribbonService, OrganizationFeignClient feignClient) {
+ this.organizationService = organizationService;
+ this.ribbonService = ribbonService;
+ this.organizationFeignClient = feignClient;
+ }
+
+ @GetMapping("/licensing/{orgId}")
+ public Licensing getLicensing(@PathVariable("orgId") String orgId) {
+ Licensing licensing = new Licensing();
+ licensing.setValid(false);
+ licensing.setOrganization(organizationService.getOrganization(orgId));
+ return licensing;
+ }
+
+ @GetMapping("/licensingByRibbon/{orgId}")
+ public Licensing getLicensingByRibbon(@PathVariable("orgId") String orgId) throws Exception{
+ Licensing licensing = new Licensing();
+ licensing.setValid(false);
+ licensing.setOrganization(ribbonService.getOrganizationWithRibbon(orgId));
+ return licensing;
+ }
+
+ @GetMapping("/licensingByFeign/{orgId}")
+ public Licensing getLicensingByFeign(@PathVariable("orgId") String orgId) {
+ Licensing licensing = new Licensing();
+ licensing.setValid(false);
+ licensing.setOrganization(organizationFeignClient.getOrganization(orgId));
+ return licensing;
+ }
+}
diff --git a/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/service/OrganizationByRibbonService.java b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/service/OrganizationByRibbonService.java
new file mode 100644
index 0000000..829d7de
--- /dev/null
+++ b/springcloud/第三篇所用代码/licensingservice/src/main/java/com/fxb/licensingservice/service/OrganizationByRibbonService.java
@@ -0,0 +1,50 @@
+package com.fxb.licensingservice.service;
+
+import com.fxb.licensingservice.Entity.Organization;
+import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
+import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2018/11/23 15:36
+ */
+@Component
+public class OrganizationByRibbonService {
+
+ private RestTemplate restTemplate;
+
+
+ @Autowired
+ public OrganizationByRibbonService(RestTemplate restTemplate) {
+ this.restTemplate = restTemplate;
+ }
+
+ @HystrixCommand(commandProperties = {
+ @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
+ }, fallbackMethod = "getOrganizationWithRibbonBackup",
+ threadPoolKey = "licenseByOrgThreadPool",
+ threadPoolProperties = {
+ @HystrixProperty(name = "coreSize", value = "30"),
+ @HystrixProperty(name = "maxQueueSize", value = "10")
+ })
+ public Organization getOrganizationWithRibbon(String id) throws Exception {
+ ResponseEntity responseEntity = restTemplate.exchange("http://organizationservice/organization/{id}",
+ HttpMethod.GET, null, Organization.class, id);
+ return responseEntity.getBody();
+ }
+
+ public Organization getOrganizationWithRibbonBackup(String id) throws Exception {
+ Organization organization = new Organization();
+ organization.setId("0");
+ organization.setName("组织服务调用失败");
+ return organization;
+ }
+}