首先在idea中新建一個(gè)工程demo勤家,作為父工程犁珠。
創(chuàng)建完成后的pom配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<modules>
<module> server1</module>
<module>client</module>
<module>ribbon</module>
<module>zuul</module>
</modules>
</project>
<modules> 聲明多個(gè)模塊:server陈莽,client底挫,ribbon,zuul淑际。
<dependencyManagement> 統(tǒng)一依賴的版本號(hào)畏纲。只是聲明依賴,并未被繼承春缕,只有子工程中寫了該依賴項(xiàng)盗胀,且未注明版本號(hào),才會(huì)從父項(xiàng)目中繼承此項(xiàng)锄贼。(當(dāng)子工程指定版本時(shí)票灰,使用子工程中指定的版本)。
<dependencies> 所有在 <dependencies>里的依賴都會(huì)自動(dòng)注入宅荤,默認(rèn)被所有的子工程繼承屑迂。即使子工程中不寫依賴,在父工程中<dependencies>里的依賴也都會(huì)被子工程繼承膘侮。
然后創(chuàng)建子工程eureka server1服務(wù)注冊(cè)中心屈糊,用于提供服務(wù)的注冊(cè)與發(fā)現(xiàn)。
server1 pom配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>server1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>server1</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
修改server1 pom <parent>繼承父工程
<parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<parent>相關(guān)配置取自父工程
pom添加相應(yīng)依賴琼了,配置完成后在啟動(dòng)類中@EnableEurekaServer。
之后進(jìn)行application.yml相關(guān)配置夫晌。
server:
port: 1111
eureka:
instance:
hostname: qlocal
prefer-ip-address: true
lease-expiration-duration-in-seconds: 20
lease-renewal-interval-in-seconds: 10
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://qlocal:1110/eureka/,http://qlocal:1111/eureka/
spring:
application:
name: SERVERSEV
server.port 聲明端口號(hào)為 1111
eureka.instance.hostname 設(shè)置當(dāng)前實(shí)例主機(jī)名為 qlocal(在本地hosts中添加 127.0.0.1 qlocal)
eureka.instance.prefer-ip-address 不使用主機(jī)名定義注冊(cè)中心地址雕薪,而使用IP地址的形式。Spring會(huì)自動(dòng)為我們獲取第一個(gè)非回環(huán)IP地址(除環(huán)路IP外的第一個(gè)IP地址)晓淀。
eureka.instance.lease-expiration-duration-in-seconds 定義服務(wù)失效時(shí)間為20 秒所袁。表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超時(shí)時(shí)間凶掰,在這個(gè)時(shí)間內(nèi)若沒(méi)收到下一次心跳燥爷,則將移除該instance。
默認(rèn)為90秒
如果該值太大懦窘,則很可能將流量轉(zhuǎn)發(fā)過(guò)去的時(shí)候前翎,該instance已經(jīng)不存活了。
如果該值設(shè)置太小了畅涂,則instance則很可能因?yàn)榕R時(shí)的網(wǎng)絡(luò)抖動(dòng)而被摘除掉港华。
該值至少應(yīng)該大于lease-renewal-interval-in-seconds的值。
eureka.instance.lease-renewal-interval-in-seconds 定義服務(wù)續(xù)約任務(wù)(心跳)的調(diào)用間隔10秒午衰。 表示eureka client發(fā)送心跳給server端的頻率立宜。如果在leaseExpirationDurationInSeconds后冒萄,server端沒(méi)有收到client的心跳,則將摘除該instance橙数。除此之外尊流,如果該instance實(shí)現(xiàn)了HealthCheckCallback,并決定讓自己unavailable的話灯帮,則該instance也不會(huì)接收到流量崖技。
默認(rèn)30秒
eureka.client.fetch-registry 為true 進(jìn)行服務(wù)檢查
eureka.client.register-with-eureka 為true 向注冊(cè)中心注冊(cè)自己
eureka.client.service-url. defaultZone=http://qlocal:1110/eureka/,http://qlocal:1111/eureka/ 指定服務(wù)注冊(cè)中心的位置為http://qlocal:1110/eureka/,http://qlocal:1111/eureka/ 兩個(gè)地址。
spring.application.name=SERVERSEV 指定應(yīng)用名稱SERVERSEV
配置完成后訪問(wèn) qlocal:1111
接著創(chuàng)建eureka client 服務(wù)提供者
pom配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
然后在啟動(dòng)類中添加@EnableEurekaClient
啟動(dòng)類
@RestController
@EnableEurekaClient
@SpringBootApplication
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
@Value("${server.port}")
String port;
@RequestMapping("/my")
public String home(@RequestParam String name){
return "my name" +name +" 端口" +port;
}
}
application.yml配置
server:
port: 1112
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1110/eureka/,http://localhost:1111/eureka/
prefer-same-zone-eureka: true
instance:
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 10
spring:
application:
name: CLIENTSEV
eureka.client.prefer-same-zone-eureka 實(shí)例是否使用同一zone里的eureka服務(wù)器施流,默認(rèn)為true响疚,理想狀態(tài)下,eureka客戶端與服務(wù)端是在同一zone下
訪問(wèn) qlocal:1112/my?name=1
eureka ribbon+hystrix 消費(fèi)者+斷路器
pom配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>ribbon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>ribbon</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
想要自動(dòng)重試必須添加retry依賴
想要自動(dòng)重試必須添加retry依賴
想要自動(dòng)重試必須添加retry依賴
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
application.yml配置
eureka:
client:
service-url:
defaultZone: http://qlocal:1110/eureka/,http://qlocal:1111/eureka/
server:
port: 1114
spring:
application:
name: RIBBONSERV
cloud:
loadbalancer:
retry:
enabled: true
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
RIBBONSERV:
ribbon:
ConnectTimeout: 250
ReadTimeout: 1000
OkToRetryOnAllOperations: true
MaxAutoRetriesNextServer: 2
MaxAutoRetries: 1
spring.cloud. loadbalancer.retry.enabled=true 開(kāi)啟重連機(jī)制
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000 斷路器的超時(shí)時(shí)間,斷路器的超時(shí)時(shí)間需要大于ribbon的超時(shí)時(shí)間瞪醋,不然不會(huì)觸發(fā)重試忿晕。
RIBBONSERV: #服務(wù)名(spring.application.name=RIBBONSERV)
ribbon:
ConnectTimeout: 250 #ribbon請(qǐng)求連接的超時(shí)時(shí)間
ReadTimeout: 1000 #ribbon 請(qǐng)求處理的超時(shí)時(shí)間
OkToRetryOnAllOperations: true #對(duì)所有操作請(qǐng)求都進(jìn)行重試
MaxAutoRetriesNextServer: 2 #對(duì)下個(gè)實(shí)例的重試次數(shù)
MaxAutoRetries: 1 #對(duì)當(dāng)前實(shí)例的重試次數(shù)
啟動(dòng)類配置
添加@EnableEurekaClient 向服務(wù)中心進(jìn)行注冊(cè)
@Bean //向程序ioc注入bean restTemplate
@LoadBalanced //表明 restTemplate開(kāi)啟負(fù)載均衡功能
@EnableHystrix
@EnableEurekaClient
@SpringBootApplication
public class RibbonApplication {
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
新建一個(gè)Service類,通過(guò)訪問(wèn)之前Clientsev的/my接口進(jìn)行測(cè)試银受。這里使用了程序名替代了具體的url地址践盼,ribbon中它會(huì)根據(jù)服務(wù)名來(lái)選擇具體的服務(wù)實(shí)例,根據(jù)服務(wù)實(shí)例在請(qǐng)求的時(shí)候會(huì)用具體的url替換掉服務(wù)名
service
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "error")
public String helservice(String name){
return restTemplate.getForObject("http://CLIENTSEV/my?name="+name,String.class);
}
public String error(String name){
return "my name" + name +" 斷路" ;
}
}
新建controller 類 調(diào)用service方法
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@RequestMapping(value = "/my")
public String con(@RequestParam String name){
return helloService.helservice(name);
}
}
啟動(dòng) 一次開(kāi)啟 server 1110 1111 client 1112 1113 ribbon 1114(qlocal:1114/my?name=1)
zuul 網(wǎng)關(guān)
pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>zuul</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
eureka:
client:
service-url:
defaultZone: http://qlocal:1110/eureka/,http://qlocal:1111/eureka/
server:
port: 1115
spring:
application:
name: ZUULSERV
cloud:
loadbalancer:
retry:
enabled: true
zuul:
routes:
ribbon:
path: /ribbon/**
serviceId: RIBBONSERV
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
ZUULSERV:
ribbon:
ConnectTimeout: 250
ReadTimeout: 1000
OkToRetryOnAllOperations: true
MaxAutoRetriesNextServer: 2
MaxAutoRetries: 1
啟動(dòng)類
@EnableEurekaClient
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
--------------------------------------------------------------------------------------------------------------------訪問(wèn)地址 qlocal:1115/ribbon/my?name=1
源碼地址:鏈接:https://pan.baidu.com/s/1rdNfniIgEV_9yQjHFCeibw 密碼:v2bd