之前搞过SpringCloud项目,但版本是netflix维护的伦敦地铁站名称的版本。现在想做一下笔记,并尝试最新版本,看有什么变动没。结果还真有一堆坑。此项目集成了eureka、feign、ribbon、hystrix、zuul五大组件。
一.项目结构项目包含两个eureka集成,两个服务提供者producer,两个服务消费者consumer,一个服务路由zuul
主要定义依赖包的版本
三、eureka搭建4.0.0 com.ykq springclouddemo 1.0.0 springclouddemo Demo project for Spring Cloud pom UTF-8 1.8 1.8 1.8 2.5.7 3.0.4 2.2.10.RELEASE springcloud-eureka-server1 springcloud-eureka-server2 springcloud-consumer1 springcloud-consumer2 springcloud-producer1 springcloud-producer2 springcloud-zuul org.springframework.boot spring-boot-starter-parent ${springboot.version} pom org.springframework.boot spring-boot-starter-web ${springboot.version} org.springframework.cloud spring-cloud-starter ${springcloud.version} org.springframework.cloud spring-cloud-netflix-eureka-client ${springcloud.version} org.springframework.cloud spring-cloud-starter-loadbalancer ${springcloud.version} org.springframework.cloud spring-cloud-starter-openfeign ${springcloud.version} org.springframework.cloud spring-cloud-starter-netflix-eureka-server ${springcloud.version} org.springframework.cloud spring-cloud-starter-netflix-hystrix ${springcloud.netflix.version} org.springframework.cloud spring-cloud-starter-netflix-zuul ${springcloud.netflix.version} org.springframework.cloud spring-cloud-starter-netflix-ribbon ${springcloud.netflix.version} io.github.openfeign feign-hystrix 10.12 com.netflix.eureka eureka-client 1.10.16 com.netflix.ribbon ribbon-eureka 2.2.5
下面展示两个eureka的文件
1.springcloud-eureka-server1 (1)eureka1的pom.xml(2)eureka1的application.properties4.0.0 com.ykq springclouddemo 1.0.0 com.ykq springcloud-eureka-server1 1.0.0 springcloud-eureka-server1 Demo project for Spring Cloud 1.8 org.springframework.boot spring-boot-starter-parent pom org.springframework.cloud spring-cloud-starter org.springframework.cloud spring-cloud-starter-netflix-eureka-server gson com.google.code.gson org.springframework.boot spring-boot-maven-plugin 2.3.0.RELEASE repackage SpringcloudEurekaServerApplication1 com.ykq.SpringcloudEurekaServerApplication1
spring.application.name=springcloud-eureka-server server.port=10001 # 不向eureka注册 eureka.client.register-with-eureka=false # 不从eureka获取注册信息 eureka.client.fetch-registry=false # 向eureka注册的地址,后面服务名称必须为eureka eureka.client.serviceUrl.defaultZone=http://localhost:10002/eureka/(3)eureka1的启动类
package com.ykq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudEurekaServerApplication1 {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaServerApplication1.class, args);
}
}
2.springcloud-eureka-server2
(1)eureka2的pom.xml
(2)eureka2的application.properties4.0.0 com.ykq springclouddemo 1.0.0 com.ykq springcloud-eureka-server2 1.0.0 springcloud-eureka-server2 Demo project for Spring Cloud 1.8 org.springframework.boot spring-boot-starter-parent pom org.springframework.cloud spring-cloud-starter org.springframework.cloud spring-cloud-starter-netflix-eureka-server gson com.google.code.gson org.springframework.boot spring-boot-maven-plugin 2.3.0.RELEASE repackage SpringcloudEurekaServerApplication2 com.ykq.SpringcloudEurekaServerApplication2
spring.application.name=springcloud-eureka-server server.port=10002 # 不向eureka注册 eureka.client.register-with-eureka=false # 不从eureka获取注册信息 eureka.client.fetch-registry=false # 向eureka注册的地址,后面服务名称必须为eureka eureka.client.serviceUrl.defaultZone=http://localhost:10001/eureka/(3)eureka2的启动类
package com.ykq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudEurekaServerApplication2 {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaServerApplication2.class, args);
}
}
四、producer搭建
1.springcloud-producer1
(1)producer1的项目结构
(2)producer1的pom.xml
(3)producer1的application.properties4.0.0 com.ykq springclouddemo 1.0.0 com.ykq springcloud-producer1 1.0.0 springcloud-producer1 Demo project for Spring Cloud 1.8 org.springframework.boot spring-boot-starter-parent pom org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter org.springframework.cloud spring-cloud-netflix-eureka-client org.springframework.cloud spring-cloud-starter-netflix-hystrix com.netflix.eureka eureka-client gson com.google.code.gson org.springframework.boot spring-boot-maven-plugin 2.3.0.RELEASE repackage SpringcloudProducerApplication1 com.ykq.SpringcloudProducerApplication1
spring.application.name=springcloud-producer server.port=10003 eureka.client.serviceUrl.defaultZone=http://localhost:10001/eureka/,http://localhost:10002/eureka/ eureka.instance.prefer-ip-address=true(4)producer1的启动类
package com.ykq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
@EnableHystrix
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudProducerApplication1 {
public static void main(String[] args) {
SpringApplication.run(SpringCloudProducerApplication1.class, args);
}
}
(5)producer1的HelloController1
package com.ykq.hello;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController1 {
@RequestMapping(value = "/hello")
public String hello() {
return "hello world, I am producer1";
}
}
(6)producer1的ProducerController1
package com.ykq.producer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProducerController1 {
@RequestMapping("/producerSupport")
public String producer() {
return "Hello, this is producer1 at your service!";
}
}
(7)producer1的TestController1
package com.ykq.test;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController1 {
@HystrixCommand(fallbackMethod = "hystrixFallBack")
@RequestMapping(value = "/test")
public String hystrix() {
throw new RuntimeException();
}
public String hystrixFallBack() {
return "I am hystrixFallBack1";
}
}
2.springcloud-producer2
(1)producer2的项目结构
(2)producer2的pom.xml
(3)producer2的application.properties4.0.0 com.ykq springclouddemo 1.0.0 com.ykq springcloud-producer2 1.0.0 springcloud-producer2 Demo project for Spring Cloud 1.8 org.springframework.boot spring-boot-starter-parent pom org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter org.springframework.cloud spring-cloud-netflix-eureka-client org.springframework.cloud spring-cloud-starter-netflix-hystrix com.netflix.eureka eureka-client gson com.google.code.gson org.springframework.boot spring-boot-maven-plugin 2.3.0.RELEASE repackage SpringcloudProducerApplication2 com.ykq.SpringcloudProducerApplication2
spring.application.name=springcloud-producer server.port=10004 eureka.client.serviceUrl.defaultZone=http://localhost:10001/eureka/,http://localhost:10002/eureka/ eureka.instance.prefer-ip-address=true(4)producer2的启动类
package com.ykq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
@EnableHystrix
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudProducerApplication2 {
public static void main(String[] args) {
SpringApplication.run(SpringCloudProducerApplication2.class, args);
}
}
(5)producer2的HelloController2
package com.ykq.hello;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController2 {
@RequestMapping(value = "/hello")
public String hello() {
return "hello world, I am producer2";
}
}
(6)producer2的ProducerController2
package com.ykq.producer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProducerController2 {
@RequestMapping("/producerSupport")
public String producer() {
return "Hello, this is producer2 at your service!";
}
}
(7)producer2的TestController2
package com.ykq.test;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController2 {
@HystrixCommand(fallbackMethod = "hystrixFallBack")
@RequestMapping(value = "/test")
public String hystrix() {
throw new RuntimeException();
}
public String hystrixFallBack() {
return "I am hystrixFallBack2";
}
}
五、consumer搭建
1.springcloud-consumer1
(1)consumer1的项目结构
(2)consumer1的pom.xml
(3)consumer1的application.propertiesspringclouddemo com.ykq 1.0.0 4.0.0 com.ykq springcloud-consumer1 1.0.0 1.8 org.springframework.boot spring-boot-starter-parent pom org.springframework.cloud spring-cloud-starter org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-netflix-eureka-client org.springframework.cloud spring-cloud-starter-loadbalancer org.springframework.cloud spring-cloud-starter-openfeign org.springframework.cloud spring-cloud-starter-netflix-hystrix io.github.openfeign feign-hystrix com.netflix.eureka eureka-client gson com.google.code.gson org.springframework.boot spring-boot-maven-plugin 2.3.0.RELEASE repackage SpringCloudConsumerApplication1 com.ykq.SpringCloudConsumerApplication1
spring.application.name=springcloud-consumer server.port=10005 eureka.client.serviceUrl.defaultZone=http://localhost:10001/eureka/,http://localhost:10002/eureka/ eureka.instance.appname=springcloud-consumer server.servlet.context-path=/springcloud-consumer # 开启hystrix断路器,老版本为feign。hystrix.enable==true feign.circuitbreaker.enabled=true #允许存在多个Feign调用相同Service的接口 spring.main.allow-bean-definition-overriding=true eureka.instance.prefer-ip-address=true(4)consumer1的启动类
package com.ykq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class SpringCloudConsumerApplication1 {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsumerApplication1.class, args);
}
}
(5)consumer1的HelloController
package com.ykq.hello;
import com.ykq.api.HelloFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private HelloFeign helloFeign;
@RequestMapping(value = "/hello")
public String hello() {
return helloFeign.hello();
}
}
(6)consumer1的HelloFeign
package com.ykq.api;
import com.ykq.api.hystrix.HelloFeignHystrix;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name= "springcloud-producer", fallback= HelloFeignHystrix.class)
public interface HelloFeign {
@RequestMapping(value = "/hello")
String hello();
}
(7)consumer1的HelloFeignHystrix
package com.ykq.api.hystrix;
import com.ykq.api.HelloFeign;
import org.springframework.stereotype.Component;
@Component
public class HelloFeignHystrix implements HelloFeign {
public String hello() {
return "hello world, I am feign hystrix1";
}
}
(8)consumer1的ConsumerController
package com.ykq.consumer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConsumerController {
@RequestMapping("/consumerSupport")
public String consumer(){
return "Hello, this is consumer1 at your service!";
}
}
(9)consumer1的TestController
package com.ykq.test;
import com.ykq.api.TestFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private TestFeign testFeign;
@RequestMapping("/test")
public String test() {
return testFeign.test();
}
}
(10)consumer的TestFeign
package com.ykq.api;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name= "springcloud-producer")
public interface TestFeign {
@RequestMapping(value = "/test")
String test();
}
2.springcloud-consumer2
(1)consumer2的项目结构
(2)consumer2的pom.xml
(3)consumer2的application.propertiesspringclouddemo com.ykq 1.0.0 4.0.0 com.ykq springcloud-consumer2 1.0.0 1.8 org.springframework.boot spring-boot-starter-parent pom org.springframework.cloud spring-cloud-starter org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-netflix-eureka-client org.springframework.cloud spring-cloud-starter-loadbalancer org.springframework.cloud spring-cloud-starter-openfeign org.springframework.cloud spring-cloud-starter-netflix-hystrix io.github.openfeign feign-hystrix com.netflix.eureka eureka-client gson com.google.code.gson org.springframework.boot spring-boot-maven-plugin 2.3.0.RELEASE repackage SpringCloudConsumerApplication2 com.ykq.SpringCloudConsumerApplication2
spring.application.name=springcloud-consumer server.port=10006 eureka.client.serviceUrl.defaultZone=http://localhost:10001/eureka/,http://localhost:10002/eureka/ eureka.instance.appname=springcloud-consumer server.servlet.context-path=/springcloud-consumer # 开启hystrix断路器,老版本为feign。hystrix.enable==true feign.circuitbreaker.enabled=true #允许存在多个Feign调用相同Service的接口 spring.main.allow-bean-definition-overriding=true eureka.instance.prefer-ip-address=true(4)consumer2的启动类
package com.ykq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class SpringCloudConsumerApplication2 {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsumerApplication2.class, args);
}
}
(5)consumer2的HelloController
package com.ykq.hello;
import com.ykq.api.HelloFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private HelloFeign helloFeign;
@RequestMapping(value = "/hello")
public String hello() {
return helloFeign.hello();
}
}
(6)consumer2的HelloFeign
package com.ykq.api;
import com.ykq.api.hystrix.HelloFeignHystrix;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name= "springcloud-producer", fallback= HelloFeignHystrix.class)
public interface HelloFeign {
@RequestMapping(value = "/hello")
String hello();
}
(7)consumer2的HelloFeignHystrix
package com.ykq.api.hystrix;
import com.ykq.api.HelloFeign;
import org.springframework.stereotype.Component;
@Component
public class HelloFeignHystrix implements HelloFeign {
public String hello() {
return "hello world, I am feign hystrix2";
}
}
(8)consumer2的ConsumerController
package com.ykq.consumer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConsumerController {
@RequestMapping("/consumerSupport")
public String consumer(){
return "Hello, this is consumer2 at your service!";
}
}
(9)consumer2的TestController
package com.ykq.test;
import com.ykq.api.TestFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private TestFeign testFeign;
@RequestMapping("/test")
public String test() {
return testFeign.test();
}
}
(10)consumer2的TestFeign
package com.ykq.api;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name= "springcloud-producer")
public interface TestFeign {
@RequestMapping(value = "/test")
String test();
}
六、zuul搭建
1.springcloud-zuul
(1)zuul的pom.xml
(2)zuul的application.properties4.0.0 springclouddemo com.ykq 1.0.0 com.ykq springcloud-zuul 1.0.0 springcloud-zuul Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-parent pom org.springframework.cloud spring-cloud-starter org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-netflix-eureka-client org.springframework.cloud spring-cloud-starter-loadbalancer org.springframework.cloud spring-cloud-starter-netflix-zuul org.springframework.cloud spring-cloud-starter-netflix-ribbon com.netflix.eureka eureka-client gson com.google.code.gson com.netflix.ribbon ribbon-eureka org.springframework.boot spring-boot-maven-plugin 2.3.0.RELEASE repackage SpringCloudZuulApplication com.ykq.SpringCloudZuulApplication
spring.application.name=springcloud-zuul server.port=10007 eureka.client.fetch-registry=true eureka.client.serviceUrl.defaultZone=http://localhost:10001/eureka/,http://localhost:10002/eureka/ eureka.instance.prefer-ip-address=true #server.servlet.context-path=/zuul zuul.routes.springcloud-consumer.path=/springcloud-consumer/** zuul.routes.springcloud-consumer.serviceId=springcloud-consumer #zuul.routes.springcloud-consumer.url=http://127.0.0.1:10005/ zuul.routes.springcloud-consumer.strip-prefix=false springcloud-consumer.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList springcloud-consumer.ribbon.ServerListUpdaterClassName=com.netflix.niws.loadbalancer.EurekaNotificationServerListUpdater # refresh every minute springcloud-consumer.ribbon.ServerListRefreshInterval=60000 zuul.routes.springcloud-producer.path=/springcloud-producer/** # 只添加serviceId是不行的,需要指定NIWSServerListClassName和ServerListUpdaterClassName #zuul.routes.producer.service-id=springcloud-producer # 单一url没法实现负载 #zuul.routes.springcloud-producer.url=http://127.0.0.1:10003/ # 指定负载url springcloud-producer.ribbon.listOfServers=http://127.0.0.1:10003/,http://127.0.0.1:10004/ zuul.routes.baidu.path=/json/** zuul.routes.baidu.url=http://www.json.cn/ # 设置超时时间 zuul.host.connect-timeout-millis=3000 zuul.host.connection-request-timeout-millis=3000 # 强制加载,不设置会进行懒加载。spring 第一次请求会非常慢 zuul.ribbon.eager-load.enabled=true # ribbon 从eureka拉取数据 ribbon.eureka.enabled=true(3)zuul的启动类
package com.ykq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@EnableDiscoveryClient
@EnableEurekaClient
@SpringBootApplication
public class SpringCloudZuulApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudZuulApplication.class, args);
}
}



