diff --git a/spring-cloud-23/.gitignore b/spring-cloud-23/.gitignore
new file mode 100644
index 0000000..4de35a3
--- /dev/null
+++ b/spring-cloud-23/.gitignore
@@ -0,0 +1,9 @@
+*/target/
+*.project
+*.classpath
+*.project
+*.settings
+*.mvn
+*.project
+*.springBeans
+*.bin
\ No newline at end of file
diff --git a/spring-cloud-23/pom.xml b/spring-cloud-23/pom.xml
new file mode 100644
index 0000000..e8768a9
--- /dev/null
+++ b/spring-cloud-23/pom.xml
@@ -0,0 +1,88 @@
+
+
+ 4.0.0
+
+ com.roncoo.education
+ spring-cloud-23
+ 0.0.1-SNAPSHOT
+ pom
+
+ spring-cloud-23
+ roncoo-spring-cloud project for Spring Boot
+
+
+ spring-cloud-bean-23
+ spring-cloud-api-23
+ spring-cloud-consumer-23
+ spring-cloud-provider-23
+ spring-cloud-service-23
+ spring-cloud-turbine-23
+ spring-cloud-gateway-23
+
+
+
+
+
+
+ io.spring.platform
+ platform-bom
+ Brussels-SR1
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+
+ com.roncoo.education
+ spring-cloud-bean-23
+ ${project.version}
+
+
+ com.roncoo.education
+ spring-cloud-api-23
+ ${project.version}
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ Camden.SR6
+
+ pom
+ import
+
+
+
+
+
+
+ spring-snapshots
+ Spring Snapshots
+ https://repo.spring.io/snapshot
+
+ true
+
+
+
+ spring-milestones
+ Spring Milestones
+ https://repo.spring.io/milestone
+
+ false
+
+
+
+
diff --git a/spring-cloud-23/spring-cloud-api-23/pom.xml b/spring-cloud-23/spring-cloud-api-23/pom.xml
new file mode 100644
index 0000000..183d317
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-api-23/pom.xml
@@ -0,0 +1,29 @@
+
+
+ 4.0.0
+
+
+ com.roncoo.education
+ spring-cloud-23
+ 0.0.1-SNAPSHOT
+
+
+ spring-cloud-api-23
+ jar
+
+ spring-cloud-api-23
+ spring-cloud project for Spring Boot
+
+
+
+ com.roncoo.education
+ spring-cloud-bean-23
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-feign
+
+
+
diff --git a/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/IRoncooBiz.java b/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/IRoncooBiz.java
new file mode 100644
index 0000000..2050357
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/IRoncooBiz.java
@@ -0,0 +1,16 @@
+package com.roncoo.education.feign;
+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 wujing
+ */
+@FeignClient(value = "roncoo", url = "www.roncoo.com")
+public interface IRoncooBiz {
+
+ @RequestMapping(value = "/{url}", method = RequestMethod.GET)
+ String get(@PathVariable(name = "url") String url);
+
+}
diff --git a/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/IUserBiz.java b/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/IUserBiz.java
new file mode 100644
index 0000000..5024661
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/IUserBiz.java
@@ -0,0 +1,53 @@
+package com.roncoo.education.feign;
+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;
+
+import com.roncoo.education.feign.configuration.RcFeignConfiguration;
+import com.roncoo.education.feign.fallback.RcFeignFallback;
+import com.roncoo.education.service.UserService;
+
+/**
+ * @author wujing
+ */
+@FeignClient(value = "spring-cloud-provider", configuration = RcFeignConfiguration.class, fallback=RcFeignFallback.class)
+public interface IUserBiz extends UserService{
+
+ @RequestMapping(value = "/api/user/{id}", method = RequestMethod.GET)
+ String view1(@PathVariable(name = "id") int id);
+ //说明:method需要指定
+
+ //@RequestLine("GET /api/user/{id}")
+ //String view1(@Param(value = "id") int id);
+
+ //@GetMapping(value = "/api/user/{id}")
+ //String view1(@PathVariable(name = "id") int id);
+
+
+ // 不支持该方式传值,启动出错。
+ //@RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET)
+ //User get3(@PathVariable(value = "id") int id, @RequestParam String name);
+
+ /*@RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET)
+ User get4(@PathVariable(value = "id") int id, @RequestParam Map name);
+
+ @RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET)
+ User get5(@PathVariable(value = "id") int id, @RequestParam(value = "name") String name);
+
+ @RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET)
+ User get1(@PathVariable(value = "id") int id, String name);
+
+ @RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET)
+ User get2(@PathVariable(value = "id") int id, Map name);
+
+ @RequestMapping(value = "/api/user/{id}", method = RequestMethod.GET)
+ User view(@PathVariable(value = "id") int id);
+
+ //@RequestMapping(value = "/api/user/{id}", method = RequestMethod.GET)
+ //String view1(@PathVariable(value = "id") int id);
+
+ @RequestMapping(value = "/api/user/{id}", method = RequestMethod.GET)
+ Map view2(@PathVariable(value = "id") int id);*/
+
+}
diff --git a/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/configuration/RcFeignConfiguration.java b/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/configuration/RcFeignConfiguration.java
new file mode 100644
index 0000000..ead60b1
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/configuration/RcFeignConfiguration.java
@@ -0,0 +1,47 @@
+package com.roncoo.education.feign.configuration;
+import java.lang.reflect.Method;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Scope;
+
+import com.netflix.hystrix.HystrixCommand;
+import com.netflix.hystrix.HystrixCommand.Setter;
+import com.netflix.hystrix.HystrixCommandGroupKey;
+import com.netflix.hystrix.HystrixCommandKey;
+
+import feign.Feign;
+import feign.Logger;
+import feign.Target;
+import feign.hystrix.HystrixFeign;
+import feign.hystrix.SetterFactory;
+
+//@Configuration
+public class RcFeignConfiguration {
+
+ @Bean
+ public Logger.Level feignLoggerLevel() {
+ return feign.Logger.Level.FULL;
+ }
+
+ /*@Bean
+ public Contract feignContract() {
+ return new feign.Contract.Default();
+ }*/
+
+ @Bean
+ @Scope("prototype")
+ public Feign.Builder feignBuilder() {
+ class RcSetterFactory implements SetterFactory {
+ @Override
+ public Setter create(Target> target, Method method) {
+ String groupKey = target.name();
+ String commandKey = method.getName();
+ return HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(groupKey))
+ .andCommandKey(HystrixCommandKey.Factory.asKey(commandKey));
+ }
+ }
+ return HystrixFeign.builder().setterFactory(new RcSetterFactory());
+ // return Feign.builder();
+ }
+
+}
diff --git a/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/fallback/RcFeignFallback.java b/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/fallback/RcFeignFallback.java
new file mode 100644
index 0000000..e109ccf
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-api-23/src/main/java/com/roncoo/education/feign/fallback/RcFeignFallback.java
@@ -0,0 +1,19 @@
+package com.roncoo.education.feign.fallback;
+import org.springframework.stereotype.Component;
+
+import com.roncoo.education.bean.User;
+import com.roncoo.education.feign.IUserBiz;
+
+@Component
+public class RcFeignFallback implements IUserBiz {
+ @Override
+ public User find(int id) {
+ return null;
+ }
+
+ @Override
+ public String view1(int id) {
+ System.out.println("调用远程接口异常,返回自定义信息");
+ return "system error";
+ }
+}
diff --git a/spring-cloud-23/spring-cloud-bean-23/pom.xml b/spring-cloud-23/spring-cloud-bean-23/pom.xml
new file mode 100644
index 0000000..a833d53
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-bean-23/pom.xml
@@ -0,0 +1,25 @@
+
+
+ 4.0.0
+
+
+ com.roncoo.education
+ spring-cloud-23
+ 0.0.1-SNAPSHOT
+
+
+ spring-cloud-bean-23
+ jar
+
+ spring-cloud-bean-23
+ spring-cloud project for Spring Boot
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
diff --git a/spring-cloud-23/spring-cloud-bean-23/src/main/java/com/roncoo/education/bean/User.java b/spring-cloud-23/spring-cloud-bean-23/src/main/java/com/roncoo/education/bean/User.java
new file mode 100644
index 0000000..0bf4fc1
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-bean-23/src/main/java/com/roncoo/education/bean/User.java
@@ -0,0 +1,44 @@
+package com.roncoo.education.bean;
+
+import java.util.Date;
+
+/**
+ * 实体类
+ *
+ * @author wujing
+ */
+public class User {
+ private int id;
+ private String name;
+ private Date createTime;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Date getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ @Override
+ public String toString() {
+ return "RoncooUser [id=" + id + ", name=" + name + ", createTime=" + createTime + "]";
+ }
+
+}
diff --git a/spring-cloud-23/spring-cloud-bean-23/src/main/java/com/roncoo/education/service/UserService.java b/spring-cloud-23/spring-cloud-bean-23/src/main/java/com/roncoo/education/service/UserService.java
new file mode 100644
index 0000000..0168085
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-bean-23/src/main/java/com/roncoo/education/service/UserService.java
@@ -0,0 +1,13 @@
+package com.roncoo.education.service;
+
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import com.roncoo.education.bean.User;
+
+public interface UserService {
+
+ @RequestMapping(method = RequestMethod.GET, value = "/api/user/find/{id}")
+ User find(@PathVariable(value = "id") int id);
+}
diff --git a/spring-cloud-23/spring-cloud-consumer-23/pom.xml b/spring-cloud-23/spring-cloud-consumer-23/pom.xml
new file mode 100644
index 0000000..4037f71
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-consumer-23/pom.xml
@@ -0,0 +1,67 @@
+
+
+ 4.0.0
+
+
+ com.roncoo.education
+ spring-cloud-23
+ 0.0.1-SNAPSHOT
+
+
+ spring-cloud-consumer-23
+ jar
+
+ spring-cloud-consumer-23
+ spring-cloud project for Spring Boot
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.cloud
+ spring-cloud-starter-hystrix
+
+
+
+ com.roncoo.education
+ spring-cloud-api-23
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-devtools
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+ true
+
+
+
+
+
diff --git a/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/ConsumerApplication.java b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/ConsumerApplication.java
new file mode 100644
index 0000000..0d77b7e
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/ConsumerApplication.java
@@ -0,0 +1,27 @@
+package com.roncoo.education;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.client.RestTemplate;
+
+@EnableCircuitBreaker
+@EnableFeignClients
+@EnableEurekaClient
+@SpringBootApplication
+public class ConsumerApplication {
+
+ @Bean
+ @LoadBalanced
+ protected RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+ public static void main(String[] args) {
+ SpringApplication.run(ConsumerApplication.class, args);
+ }
+}
diff --git a/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/Provider2Configuration.java b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/Provider2Configuration.java
new file mode 100644
index 0000000..2c9da7e
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/Provider2Configuration.java
@@ -0,0 +1,9 @@
+//package com.roncoo.education.configuration;
+//import org.springframework.cloud.netflix.ribbon.RibbonClient;
+//import org.springframework.context.annotation.Configuration;
+//
+//@Configuration
+//@RibbonClient(name = "spring-cloud-provider2", configuration = RoundRobinRuleConfig.class)
+//public class Provider2Configuration {
+//
+//}
diff --git a/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/ProviderConfiguration.java b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/ProviderConfiguration.java
new file mode 100644
index 0000000..426fa6b
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/ProviderConfiguration.java
@@ -0,0 +1,10 @@
+//package com.roncoo.education.configuration;
+//
+//import org.springframework.cloud.netflix.ribbon.RibbonClient;
+//import org.springframework.context.annotation.Configuration;
+//
+//@Configuration
+//@RibbonClient(name = "spring-cloud-provider", configuration = RandomRuleConfig.class)
+//public class ProviderConfiguration {
+//
+//}
diff --git a/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/RandomRuleConfig.java b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/RandomRuleConfig.java
new file mode 100644
index 0000000..1aa4cd4
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/RandomRuleConfig.java
@@ -0,0 +1,18 @@
+//package com.roncoo.education.configuration;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import com.netflix.loadbalancer.IRule;
+//import com.netflix.loadbalancer.RandomRule;
+//
+///**
+// * 随机算法
+// *
+// * @author wujing
+// */
+////@Configuration
+//public class RandomRuleConfig {
+// @Bean
+// public IRule randomRule() {
+// return new RandomRule();
+// }
+//}
diff --git a/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/RoncooCustomRule.java b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/RoncooCustomRule.java
new file mode 100644
index 0000000..498542b
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/RoncooCustomRule.java
@@ -0,0 +1,64 @@
+package com.roncoo.education.configuration;
+
+import java.util.List;
+
+import com.netflix.client.config.IClientConfig;
+import com.netflix.loadbalancer.AbstractLoadBalancerRule;
+import com.netflix.loadbalancer.ILoadBalancer;
+import com.netflix.loadbalancer.Server;
+
+/**
+ * 自定义Ribbon的负载均衡策略
+ *
+ */
+public class RoncooCustomRule extends AbstractLoadBalancerRule {
+
+ private Server choose(ILoadBalancer lb, Object key) {
+ if (lb == null) {
+ return null;
+ }
+ Server server = null;
+
+ while (server == null) {
+ if (Thread.interrupted()) {
+ return null;
+ }
+
+ List upList = lb.getReachableServers(); // 可用的服务实例
+
+ // 只获取端口为:7779的服务实例
+ for (Server s : upList) {
+ if (s.getPort() == 7779) {
+ server = s;
+ }
+ }
+
+ if (server == null) {
+ Thread.yield();
+ continue;
+ }
+
+ System.out.println("实例IP:" + server.getHost() + " 端口:" + server.getPort());
+
+ if (server.isAlive()) {
+ return (server);
+ }
+
+ server = null;
+ Thread.yield();
+ }
+
+ return server;
+ }
+
+ @Override
+ public Server choose(Object key) {
+ return choose(getLoadBalancer(), key);
+ }
+
+ @Override
+ public void initWithNiwsConfig(IClientConfig clientConfig) {
+ // TODO Auto-generated method stub
+ }
+
+}
diff --git a/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/RoundRobinRuleConfig.java b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/RoundRobinRuleConfig.java
new file mode 100644
index 0000000..18beb71
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/configuration/RoundRobinRuleConfig.java
@@ -0,0 +1,17 @@
+//package com.roncoo.education.configuration;
+//import org.springframework.context.annotation.Bean;
+//import com.netflix.loadbalancer.IRule;
+//import com.netflix.loadbalancer.RandomRule;
+//import com.netflix.loadbalancer.RoundRobinRule;
+///**
+// * 轮询算法
+// *
+// * @author wujing
+// */
+//// @Configuration
+//public class RoundRobinRuleConfig {
+// @Bean
+// public IRule roundRobinRule() {
+// return new RandomRule();
+// }
+//}
diff --git a/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/controller/FeignUserController.java b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/controller/FeignUserController.java
new file mode 100644
index 0000000..2e89232
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/controller/FeignUserController.java
@@ -0,0 +1,39 @@
+package com.roncoo.education.controller;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+import com.roncoo.education.feign.IRoncooBiz;
+import com.roncoo.education.feign.IUserBiz;
+
+/**
+ * @author wujing
+ */
+@RestController
+@RequestMapping(value = "/feign/user", method = RequestMethod.POST)
+public class FeignUserController {
+
+ @Autowired
+ private IUserBiz userBiz;
+
+ @Autowired
+ private IRoncooBiz roncooBiz;
+
+ @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+ public String get(@PathVariable(value = "id") int id) {
+ //System.out.println(userBiz.view(id));
+ //System.out.println(userBiz.view1(id));
+ //System.out.println(userBiz.view2(id));
+
+ //String name = "测试1";
+ //Map map = new HashMap<>();
+ //map.put("name", "测试2");
+ //userBiz.get4(id, map);
+ //userBiz.get5(id, name);
+ //System.out.println(roncooBiz.get("course/list.html"));
+ //System.out.println(userBiz.find(id));
+ return userBiz.view1(id);
+ }
+}
diff --git a/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/controller/UserController.java b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/controller/UserController.java
new file mode 100644
index 0000000..1074c23
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-consumer-23/src/main/java/com/roncoo/education/controller/UserController.java
@@ -0,0 +1,47 @@
+
+package com.roncoo.education.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+import org.springframework.web.client.RestTemplate;
+
+import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
+import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
+import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
+
+/**
+ * @author wujing
+ */
+@RestController
+@RequestMapping(value = "/user", method = RequestMethod.POST)
+public class UserController {
+
+ // private static final String URL="http://localhost:7777/api/user/{id}";
+ private static final String URL = "http://spring-cloud-provider/api/user/{id}";
+ private static final String URL2 = "http://spring-cloud-provider2/api/user/{id}";
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ @HystrixCommand(fallbackMethod = "getFallback", commandProperties = @HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value = "SEMAPHORE"))
+ //@HystrixCommand(fallbackMethod = "getFallback", commandKey="", groupKey="")
+ @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+ public String get(@PathVariable(value = "id") int id) {
+ //throw new RuntimeException();
+ return restTemplate.getForObject(URL, String.class, id);
+ }
+
+ public String getFallback(int id) {
+ System.out.println("调用远程接口异常,返回自定义信息");
+ return "自定义信息";
+ }
+
+ @RequestMapping(value = "/2/{id}", method = RequestMethod.GET)
+ public String get2(@PathVariable(value = "id") int id) {
+ return restTemplate.getForObject(URL2, String.class, id);
+ }
+
+}
diff --git a/spring-cloud-23/spring-cloud-consumer-23/src/main/resources/application.properties b/spring-cloud-23/spring-cloud-consumer-23/src/main/resources/application.properties
new file mode 100644
index 0000000..f82f9ba
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-consumer-23/src/main/resources/application.properties
@@ -0,0 +1,56 @@
+# server
+server.port=8888
+
+# spring
+spring.application.name=spring-cloud-consumer
+
+# eureka
+#eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
+eureka.client.serviceUrl.defaultZone=http://roncoo:123456@localhost:8761/eureka/
+
+# info自定义
+info.build.name=@project.name@
+info.build.description=@project.description@
+info.build.groupId=@project.groupId@
+info.build.artifact=@project.artifactId@
+info.build.version=@project.version@
+
+eureka.instance.status-page-url-path=/info
+eureka.instance.instanceId=${spring.application.name}:${random.value}
+eureka.instance.prefer-ip-address=true
+
+#设置拉取服务注册信息时间,默认60s
+eureka.client.registry-fetch-interval-seconds=30
+
+#指定续约更新频率,默认是30s
+eureka.instance.lease-renewal-interval-in-seconds=15
+
+#设置过期剔除时间,默认90s
+eureka.instance.lease-expiration-duration-in-seconds=45
+
+#设置策略
+spring-cloud-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
+spring-cloud-provider2.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
+#spring-cloud-provider.ribbon.NFLoadBalancerRuleClassName=com.roncoo.education.configuration.RoncooCustomRule
+#格式为:应用名.ribbon.NFLoadBalancerRuleClassName=xxx
+
+# 日志配置,默认是不打印任何的日志
+logging.level.com.roncoo.education.feign=debug
+
+# 开启压缩
+feign.compression.request.enabled=true
+feign.compression.response.enabled=true
+# 更多配置
+feign.compression.request.mime-types=text/xml,application/xml,application/json
+feign.compression.request.min-request-size=2048
+
+# 在feign里面禁用hystrix
+#feign.hystrix.enabled=false
+
+# 在feign和Ribbon里面配置隔离策略(全局配置)
+#hystrix.command.default.execution.isolation.strategy=SEMAPHORE
+# 配置单个
+#hystrix.command.view1.execution.isolation.strategy=SEMAPHORE
+
+# 元数据
+eureka.instance.metadata-map.cluster=RONCOO
diff --git a/spring-cloud-23/spring-cloud-consumer-23/src/test/java/com/roncoo/education/ConsumerApplicationTests.java b/spring-cloud-23/spring-cloud-consumer-23/src/test/java/com/roncoo/education/ConsumerApplicationTests.java
new file mode 100644
index 0000000..4b1701b
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-consumer-23/src/test/java/com/roncoo/education/ConsumerApplicationTests.java
@@ -0,0 +1,16 @@
+package com.roncoo.education;
+
+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 ConsumerApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
diff --git a/spring-cloud-23/spring-cloud-gateway-23/pom.xml b/spring-cloud-23/spring-cloud-gateway-23/pom.xml
new file mode 100644
index 0000000..56109a4
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-gateway-23/pom.xml
@@ -0,0 +1,25 @@
+
+ 4.0.0
+
+ com.roncoo.education
+ spring-cloud-23
+ 0.0.1-SNAPSHOT
+
+ spring-cloud-gateway-23
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zuul
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka
+
+
+ org.springframework.boot
+ spring-boot-devtools
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-23/spring-cloud-gateway-23/src/main/java/com/roncoo/education/GatewayApplication.java b/spring-cloud-23/spring-cloud-gateway-23/src/main/java/com/roncoo/education/GatewayApplication.java
new file mode 100644
index 0000000..1ee00da
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-gateway-23/src/main/java/com/roncoo/education/GatewayApplication.java
@@ -0,0 +1,35 @@
+package com.roncoo.education;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+import org.springframework.context.annotation.Bean;
+
+import com.roncoo.education.custom.CustomPreFilter;
+
+@EnableZuulProxy
+@SpringBootApplication
+public class GatewayApplication {
+
+ @Bean
+ public CustomPreFilter sessionPreFilter() {
+ return new CustomPreFilter();
+ }
+
+ /*@Bean
+ public PatternServiceRouteMapper serviceRouteMapper() {
+ return new PatternServiceRouteMapper("(?^.*)-(?c.*)-(?c.+$)", "${name1}-${name2}-provider") {
+ @Override
+ public String apply(final String serviceId) {
+ String route = super.apply(serviceId);
+ System.out.println(route + " -> " + serviceId);
+ return route;
+ }
+ };
+ }*/
+
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+}
diff --git a/spring-cloud-23/spring-cloud-gateway-23/src/main/java/com/roncoo/education/custom/CustomPreFilter.java b/spring-cloud-23/spring-cloud-gateway-23/src/main/java/com/roncoo/education/custom/CustomPreFilter.java
new file mode 100644
index 0000000..7e00794
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-gateway-23/src/main/java/com/roncoo/education/custom/CustomPreFilter.java
@@ -0,0 +1,51 @@
+package com.roncoo.education.custom;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.util.ReflectionUtils;
+
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+
+public class CustomPreFilter extends ZuulFilter {
+
+ @Override
+ public String filterType() {
+ return "pre";
+ }
+
+ @Override
+ public int filterOrder() {
+ return 1;
+ }
+
+ @Override
+ public boolean shouldFilter() {
+ return true;
+ }
+
+ @Override
+ public Object run() {
+ RequestContext ctx = RequestContext.getCurrentContext();
+ HttpServletRequest request = ctx.getRequest();
+ String token = request.getHeader("token");
+ if (!"roncoo".equals(token)) {
+ HttpServletResponse response = ctx.getResponse();
+ try {
+ PrintWriter writer = response.getWriter();
+ writer.println("token is error");
+ writer.close();
+ } catch (IOException e) {
+ ReflectionUtils.rethrowRuntimeException(e);
+ }
+ }
+
+ System.out.println("请求路径为:" + request.getRequestURI());
+ return null;
+ }
+
+}
diff --git a/spring-cloud-23/spring-cloud-gateway-23/src/main/java/com/roncoo/education/custom/ProviderFallbackProvider.java b/spring-cloud-23/spring-cloud-gateway-23/src/main/java/com/roncoo/education/custom/ProviderFallbackProvider.java
new file mode 100644
index 0000000..7a1cd11
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-gateway-23/src/main/java/com/roncoo/education/custom/ProviderFallbackProvider.java
@@ -0,0 +1,59 @@
+package com.roncoo.education.custom;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ProviderFallbackProvider implements ZuulFallbackProvider {
+
+ @Override
+ public String getRoute() {
+ return "spring-cloud-provider";
+ }
+
+ @Override
+ public ClientHttpResponse fallbackResponse() {
+ return new ClientHttpResponse() {
+
+ @Override
+ public HttpStatus getStatusCode() throws IOException {
+ return HttpStatus.OK;
+ }
+
+ @Override
+ public int getRawStatusCode() throws IOException {
+ return 200;
+ }
+
+ @Override
+ public String getStatusText() throws IOException {
+ return "OK";
+ }
+
+ @Override
+ public void close() {
+
+ }
+
+ @Override
+ public InputStream getBody() throws IOException {
+ return new ByteArrayInputStream((getRoute()+ " is fallback").getBytes());
+ }
+
+ @Override
+ public HttpHeaders getHeaders() {
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_JSON);
+ return headers;
+ }
+ };
+ }
+}
diff --git a/spring-cloud-23/spring-cloud-gateway-23/src/main/resources/application.properties b/spring-cloud-23/spring-cloud-gateway-23/src/main/resources/application.properties
new file mode 100644
index 0000000..98f889f
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-gateway-23/src/main/resources/application.properties
@@ -0,0 +1,92 @@
+# server
+server.port=9876
+
+# spring
+spring.application.name=spring-cloud-gateway
+
+# eureka
+#eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
+eureka.client.serviceUrl.defaultZone=http://roncoo:123456@localhost:8761/eureka/
+
+# info自定义
+info.build.name=@project.name@
+info.build.description=@project.description@
+info.build.groupId=@project.groupId@
+info.build.artifact=@project.artifactId@
+info.build.version=@project.version@
+
+eureka.instance.status-page-url-path=/info
+eureka.instance.instanceId=${spring.application.name}:${random.value}
+eureka.instance.prefer-ip-address=true
+
+#设置拉取服务注册信息时间,默认60s
+eureka.client.registry-fetch-interval-seconds=30
+
+#指定续约更新频率,默认是30s
+eureka.instance.lease-renewal-interval-in-seconds=15
+
+#设置过期剔除时间,默认90s
+eureka.instance.lease-expiration-duration-in-seconds=45
+
+# zuul...disable=true
+# 禁用自定义过滤器
+zuul.CustomPreFilter.pre.disable=true
+
+# 路由的映射,方法1
+#zuul.routes.spring-cloud-provider=/provider/**
+#zuul.routes.spring-cloud-consumer=/consumer/**
+# spring-cloud-provider服务名称,对其进行路由
+# 一个*代表匹配一层,二个**代表匹配所有。
+
+# 路由的映射,方法2
+#zuul.routes.provider1.path=/provider1/**
+#zuul.routes.provider1.service-id=spring-cloud-provider
+#zuul.routes.consumer1.path=/consumer1/**
+#zuul.routes.consumer1.service-id=spring-cloud-consumer
+# provider1,consumer2 代表id,随意,不重复即可
+
+logging.level.com.netflix.loadbalancer=debug
+
+#zuul.ignored-services=spring-cloud-provider
+# 注意: zuul.ignored-services=* 禁用所有
+
+zuul.routes.provider1.strip-prefix=false
+zuul.routes.provider1.path=/api/**
+zuul.routes.provider1.service-id=spring-cloud-provider
+zuul.routes.consumer1.strip-prefix=false
+zuul.routes.consumer1.path=/feign/**
+zuul.routes.consumer1.service-id=spring-cloud-consumer
+
+#zuul.routes.provider1.sensitive-headers=token
+#zuul.routes.spring-cloud-provider.sensitive-headers=token
+# 默认值:Cookie,Set-Cookie,Authorization
+# 注意:如果不禁用服务名的情况下,通过服务名,这个设置是无效的
+# zuul.routes.spring-cloud-provider 这种配置的情况下,也是无效的
+
+# 禁用注册中心
+#ribbon.eureka.enabled=false
+
+#zuul.routes.roncoo.path=/**
+#zuul.routes.roncoo.url=http://www.roncoo.com/
+
+#zuul.routes.roncoo.path=/**
+#zuul.routes.roncoo.service-id=roncoo-education
+#roncoo-education.ribbon.listOfServers=http://www.roncoo.com/,http://git.oschina.net/
+
+zuul.ignored-patterns=/**/feign/**
+# 忽略含有api的路径的url
+
+#zuul.routes.legacy.path=/**
+#zuul.routes.legacy.url=http://www.roncoo.com
+# 若前面的路由匹配不到,那么就使用这个
+
+hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=60000
+# 全局设置
+ribbon.ConnectTimeout=60000
+ribbon.ReadTimeout=60000
+
+
+
+
+
+
diff --git a/spring-cloud-23/spring-cloud-provider-23/pom.xml b/spring-cloud-23/spring-cloud-provider-23/pom.xml
new file mode 100644
index 0000000..901eb56
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-provider-23/pom.xml
@@ -0,0 +1,62 @@
+
+
+ 4.0.0
+
+
+ com.roncoo.education
+ spring-cloud-23
+ 0.0.1-SNAPSHOT
+
+
+ spring-cloud-provider-23
+ jar
+
+ spring-cloud-provider-23
+ spring-cloud project for Spring Boot
+
+
+
+ com.roncoo.education
+ spring-cloud-bean-23
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-23/spring-cloud-provider-23/src/main/java/com/roncoo/education/ProviderApplication.java b/spring-cloud-23/spring-cloud-provider-23/src/main/java/com/roncoo/education/ProviderApplication.java
new file mode 100644
index 0000000..605349c
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-provider-23/src/main/java/com/roncoo/education/ProviderApplication.java
@@ -0,0 +1,14 @@
+package com.roncoo.education;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+
+@EnableEurekaClient
+@SpringBootApplication
+public class ProviderApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ProviderApplication.class, args);
+ }
+}
diff --git a/spring-cloud-23/spring-cloud-provider-23/src/main/java/com/roncoo/education/controller/ApiUserController.java b/spring-cloud-23/spring-cloud-provider-23/src/main/java/com/roncoo/education/controller/ApiUserController.java
new file mode 100644
index 0000000..215f0b4
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-provider-23/src/main/java/com/roncoo/education/controller/ApiUserController.java
@@ -0,0 +1,64 @@
+package com.roncoo.education.controller;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.FileCopyUtils;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.roncoo.education.bean.User;
+
+/**
+ * @author wujing
+ */
+@RestController
+@RequestMapping(value = "/api/user")
+public class ApiUserController {
+
+ protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ @RequestMapping(value = "/get/{id}")
+ public User get(@PathVariable int id, @RequestBody(required = false) String json,
+ @RequestParam(required = false) String name, HttpServletRequest request) {
+ logger.info("请求方法类型:" + request.getMethod() + " RequestBody参数:" + json + " RequestParam参数:" + name);
+ User user = new User();
+ user.setId(id);
+ user.setName("无境");
+ user.setCreateTime(new Date());
+ // logger.info("请求接口返回:{}", user);
+ return user;
+ }
+
+ @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+ public User view(@PathVariable int id, HttpServletRequest request) throws InterruptedException {
+ //Thread.sleep(50000);
+ User user = new User();
+ user.setId(id);
+ user.setName("无境1");
+ user.setCreateTime(new Date());
+ logger.info("请求接口返回:{}", user);
+
+ System.out.println("通过zuul获取的token=" + request.getHeader("token"));
+ return user;
+ }
+
+ @RequestMapping(value = "/upload")
+ public String upload(@RequestParam(value = "file") MultipartFile file) throws IOException {
+ File out = new File("D:/" + file.getOriginalFilename());
+ FileCopyUtils.copy(file.getBytes(), out);
+ return "sucess";
+ }
+
+
+}
diff --git a/spring-cloud-23/spring-cloud-provider-23/src/main/java/com/roncoo/education/controller/FeignApiUserController.java b/spring-cloud-23/spring-cloud-provider-23/src/main/java/com/roncoo/education/controller/FeignApiUserController.java
new file mode 100644
index 0000000..4bb356b
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-provider-23/src/main/java/com/roncoo/education/controller/FeignApiUserController.java
@@ -0,0 +1,31 @@
+package com.roncoo.education.controller;
+
+import java.util.Date;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.roncoo.education.bean.User;
+import com.roncoo.education.service.UserService;
+
+/**
+ * @author wujing
+ */
+@RestController
+public class FeignApiUserController implements UserService {
+
+ protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ @Override
+ public User find(@PathVariable int id) {
+ User user = new User();
+ user.setId(id);
+ user.setName("无境1");
+ user.setCreateTime(new Date());
+ logger.info("请求接口返回:{}", user);
+ return user;
+ }
+
+}
diff --git a/spring-cloud-23/spring-cloud-provider-23/src/main/resources/application.properties b/spring-cloud-23/spring-cloud-provider-23/src/main/resources/application.properties
new file mode 100644
index 0000000..c4e5c1e
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-provider-23/src/main/resources/application.properties
@@ -0,0 +1,33 @@
+# server
+server.port=7778
+
+# spring
+spring.application.name=spring-cloud-provider
+
+# eureka
+#eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
+eureka.client.serviceUrl.defaultZone=http://roncoo:123456@localhost:8761/eureka/
+
+# info自定义
+info.build.name=@project.name@
+info.build.description=@project.description@
+info.build.groupId=@project.groupId@
+info.build.artifact=@project.artifactId@
+info.build.version=@project.version@
+
+eureka.instance.status-page-url-path=/info
+eureka.instance.instanceId=${spring.application.name}:${random.value}
+eureka.instance.prefer-ip-address=true
+
+#设置拉取服务注册信息时间,默认60s
+eureka.client.registry-fetch-interval-seconds=30
+
+#指定续约更新频率,默认是30s
+eureka.instance.lease-renewal-interval-in-seconds=15
+
+#设置过期剔除时间,默认90s
+eureka.instance.lease-expiration-duration-in-seconds=45
+
+spring.http.multipart.max-file-size=1000MB
+spring.http.multipart.max-request-size=1000MB
+
diff --git a/spring-cloud-23/spring-cloud-provider-23/src/test/java/com/roncoo/education/ProviderApplicationTests.java b/spring-cloud-23/spring-cloud-provider-23/src/test/java/com/roncoo/education/ProviderApplicationTests.java
new file mode 100644
index 0000000..e1d3cbb
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-provider-23/src/test/java/com/roncoo/education/ProviderApplicationTests.java
@@ -0,0 +1,16 @@
+package com.roncoo.education;
+
+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 ProviderApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
diff --git a/spring-cloud-23/spring-cloud-service-23/pom.xml b/spring-cloud-23/spring-cloud-service-23/pom.xml
new file mode 100644
index 0000000..36eeb00
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-service-23/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+
+ com.roncoo.education
+ spring-cloud-23
+ 0.0.1-SNAPSHOT
+
+
+ spring-cloud-service-23
+ jar
+
+ spring-cloud-service-23
+ spring-cloud project for Spring Boot
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka-server
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-devtools
+
+
+ org.springframework.cloud
+ spring-cloud-starter-hystrix-dashboard
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+ true
+
+
+
+
+
diff --git a/spring-cloud-23/spring-cloud-service-23/src/main/java/com/roncoo/education/ServiceApplication.java b/spring-cloud-23/spring-cloud-service-23/src/main/java/com/roncoo/education/ServiceApplication.java
new file mode 100644
index 0000000..f3c2a90
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-service-23/src/main/java/com/roncoo/education/ServiceApplication.java
@@ -0,0 +1,16 @@
+package com.roncoo.education;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
+import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
+
+@EnableHystrixDashboard
+@EnableEurekaServer
+@SpringBootApplication
+public class ServiceApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ServiceApplication.class, args);
+ }
+}
diff --git a/spring-cloud-23/spring-cloud-service-23/src/main/resources/application.properties b/spring-cloud-23/spring-cloud-service-23/src/main/resources/application.properties
new file mode 100644
index 0000000..35c17e9
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-service-23/src/main/resources/application.properties
@@ -0,0 +1,43 @@
+# server (eureka 默认端口为:8761)
+server.port=8761
+
+# spring
+spring.application.name=spring-cloud-server
+
+# eureka
+# 是否注册到eureka
+eureka.client.register-with-eureka=false
+# 是否从eureka获取注册信息
+eureka.client.fetch-registry=false
+# eureka服务器的地址(注意:地址最后面的 /eureka/ 这个是固定值)
+#eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
+eureka.client.serviceUrl.defaultZone=http://roncoo:123456@localhost:8761/eureka/
+eureka.client.availability-zones.roncoo=roncooZone
+eureka.client.service-url.roncooZone=http://roncoo:123456@localhost:8761/eureka/
+eureka.client.region=lll
+
+
+# info自定义
+info.build.name=@project.name@
+info.build.description=@project.description@
+info.build.groupId=@project.groupId@
+info.build.artifact=@project.artifactId@
+info.build.version=@project.version@
+
+# 指定环境
+eureka.environment=dev
+
+#指定数据中心
+eureka.datacenter=roncoo
+
+# 关闭自我保护模式
+eureka.server.enable-self-preservation=false
+
+#设置清理无效节点的时间间隔,默认60000,即是60s
+eureka.server.eviction-interval-timer-in-ms=5000
+
+# 服务认证
+security.basic.enabled=true
+security.user.name=roncoo
+security.user.password=123456
+
diff --git a/spring-cloud-23/spring-cloud-service-23/src/test/java/com/roncoo/education/ServiceApplicationTests.java b/spring-cloud-23/spring-cloud-service-23/src/test/java/com/roncoo/education/ServiceApplicationTests.java
new file mode 100644
index 0000000..17cd49c
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-service-23/src/test/java/com/roncoo/education/ServiceApplicationTests.java
@@ -0,0 +1,16 @@
+package com.roncoo.education;
+
+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 ServiceApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
diff --git a/spring-cloud-23/spring-cloud-turbine-23/pom.xml b/spring-cloud-23/spring-cloud-turbine-23/pom.xml
new file mode 100644
index 0000000..5a7d7ba
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-turbine-23/pom.xml
@@ -0,0 +1,26 @@
+
+ 4.0.0
+
+ com.roncoo.education
+ spring-cloud-23
+ 0.0.1-SNAPSHOT
+
+ spring-cloud-turbine-23
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-turbine
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-eureka
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-23/spring-cloud-turbine-23/src/main/java/com/roncoo/education/TurbineApplication.java b/spring-cloud-23/spring-cloud-turbine-23/src/main/java/com/roncoo/education/TurbineApplication.java
new file mode 100644
index 0000000..10b39b2
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-turbine-23/src/main/java/com/roncoo/education/TurbineApplication.java
@@ -0,0 +1,14 @@
+package com.roncoo.education;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.turbine.EnableTurbine;
+
+@EnableTurbine
+@SpringBootApplication
+public class TurbineApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(TurbineApplication.class, args);
+ }
+}
diff --git a/spring-cloud-23/spring-cloud-turbine-23/src/main/resources/application.properties b/spring-cloud-23/spring-cloud-turbine-23/src/main/resources/application.properties
new file mode 100644
index 0000000..3ebe003
--- /dev/null
+++ b/spring-cloud-23/spring-cloud-turbine-23/src/main/resources/application.properties
@@ -0,0 +1,42 @@
+# server
+server.port=9999
+
+# spring
+spring.application.name=spring-cloud-turbine
+
+# eureka
+#eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
+eureka.client.serviceUrl.defaultZone=http://roncoo:123456@localhost:8761/eureka/
+
+# info自定义
+info.build.name=@project.name@
+info.build.description=@project.description@
+info.build.groupId=@project.groupId@
+info.build.artifact=@project.artifactId@
+info.build.version=@project.version@
+
+eureka.instance.status-page-url-path=/info
+eureka.instance.instanceId=${spring.application.name}:${random.value}
+eureka.instance.prefer-ip-address=true
+
+#设置拉取服务注册信息时间,默认60s
+eureka.client.registry-fetch-interval-seconds=30
+
+#指定续约更新频率,默认是30s
+eureka.instance.lease-renewal-interval-in-seconds=15
+
+#设置过期剔除时间,默认90s
+eureka.instance.lease-expiration-duration-in-seconds=45
+
+# turbine(说明:注意必须为大写,因为eureka返回的值都是大写的)
+#turbine.aggregator.clusterConfig=SPRING-CLOUD-CONSUMER
+#turbine.app-config=spring-cloud-consumer
+
+#turbine.aggregator.clusterConfig=RONCOO
+#turbine.app-config=spring-cloud-consumer,spring-cloud-consumer2
+#turbine.cluster-name-expression=metadata['cluster']
+#turbine.combine-host-port=true
+
+# turbine.aggregator.clusterConfig=RONCOO
+turbine.app-config=spring-cloud-consumer,spring-cloud-consumer2
+turbine.cluster-name-expression='default'