一. 服务说明
- eureka-server ------> 注册中心
- member-service ------> 会员服务接口
- member-service-impl ------> 会员服务实现
- order-service ------> 订单服务接口
- order-service-impl -------> 会员服务实现
补充说明: 之后要创建member-service,order-service两个接口服务,是为了提高代码的覆用性.具体可参见后面的代码
二.创建项目
1.整体结构
2.创建springcloud-hystrix父工程
2.1 创建一个maven项目(略)
2.1 pom.xml依赖
<?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>qinfeng.zheng</groupId>
<artifactId>springcloud-hystrix</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>eureka-server</module>
<module>member-service</module>
<module>member-service-impl</module>
<module>order-service</module>
<module>order-service-impl</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- SpringBoot整合fegnin客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- hystrix断路器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
3.创建eureka-service子模块--->注册中心
3.1 创建一个maven工程
3.2 pom.xml依赖
<?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">
<parent>
<artifactId>springcloud-hystrix</artifactId>
<groupId>qinfeng.zheng</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-server</artifactId>
<dependencies>
<!--SpringCloud eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
3.3 在resources目录下创建application.yml文件
###服务端口号
server:
port: 8888
##定义服务名称
spring:
application:
name: eureka-server
eureka:
instance:
###注册中心ip地址
hostname: 127.0.0.1
client:
serviceUrl:
##注册地址
defaultZone: http://${eureka.instance.hostname}:8888/eureka/
####因为自己是注册中心,是否需要将自己注册给自己的注册中心(集群的时候是需要是为true)
register-with-eureka: false
###因为自己是注册中心, 不需要去检索服务信息
fetch-registry: false
server:
# 测试时关闭自我保护机制,保证不可用服务及时踢出,,,若要及时踢出过期服务,还需要在客户端进行配置
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000
3.4 创建注册中心启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApp {
public static void main(String[] args){
SpringApplication.run(EurekaServerApp.class, args);
}
}
3.5 启动该服务,浏览器访问
4. 创建member-service,会员接口项目
4.1 创建使用maven工程,略
4.2 pom.xml继承父工作 springcloud-hystrix
<?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">
<parent>
<artifactId>springcloud-hystrix</artifactId>
<groupId>qinfeng.zheng</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>member-service</artifactId>
</project>
4.2 创建接口
qinfeng.zheng.api.service.MemberService
package qinfeng.zheng.api.service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 创建时间: 13:31 2018/9/16
* 修改时间:
* 编码人员: ZhengQf
* 版 本: 0.0.1
* 功能描述:
*/
@RequestMapping("/member")
public interface MemberService {
@RequestMapping("/getMemberInfo")
String getMemberInfo(@RequestParam("username") String username);
}
5. 创建memebre-service-impl,会员服务的具体实现
5.1创建maven工程,略
5.2 pom.xml依赖
<?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">
<parent>
<artifactId>springcloud-hystrix</artifactId>
<groupId>qinfeng.zheng</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>member-service-impl</artifactId>
<dependencies>
<!--依赖member-service工作,需要它的接口,减少重复代码-->
<dependency>
<groupId>qinfeng.zheng</groupId>
<artifactId>member-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
5.3 创建接口的具体实现逻辑
qinfeng.zheng.api.serice.impl.MemberServiceImpl
package qinfeng.zheng.api.serice.impl;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import qinfeng.zheng.api.service.MemberService;
/**
* 创建时间: 13:34 2018/9/16
* 修改时间:
* 编码人员: ZhengQf
* 版 本: 0.0.1
* 功能描述:
*/
@RestController
public class MemberServiceImpl implements MemberService{
@Override
public String getMemberInfo(@RequestParam("username") String username) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return username +",调用会员服务的getMemberInfo方法成功...";
}
}
5.4 创建application.yml文件
###服务启动端口号
server:
port: 8001
###服务名称(服务注册到eureka名称)
spring:
application:
name: client-member
###服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka
## 客户端间隔30s重新读eureka中服务信息
registry-fetch-interval-seconds: 30
# 心跳检测检测与续约时间
# 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
instance:
###Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则)
lease-renewal-interval-in-seconds: 1
####Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己)
lease-expiration-duration-in-seconds: 2
5.5 创建服务启动类
package qinfeng.zheng;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* 创建时间: 13:35 2018/9/16
* 修改时间:
* 编码人员: ZhengQf
* 版 本: 0.0.1
* 功能描述:
*/
@SpringBootApplication
@EnableEurekaClient
public class MemberApp {
public static void main(String[] args){
SpringApplication.run(MemberApp.class, args);
}
}
5.6 启动服务
5.6.1 查看注册中心
5.6.2 接口测试
测试通过,服务正常!!!
6.创建order-service服务
创建过程与member-service一致.
接口方法如下:qinfeng.zheng.api.service.OrderService
package qinfeng.zheng.api.service;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 创建时间: 13:43 2018/9/16
* 修改时间:
* 编码人员: ZhengQf
* 版 本: 0.0.1
* 功能描述:
*/
@RequestMapping("/order")
public interface OrderService {
String getInfoFromMemberService(String username);
}
7.创建order-service-impl服务
7.1 创建maven工程,略
7.2 pom.xml依赖
<?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">
<parent>
<artifactId>springcloud-hystrix</artifactId>
<groupId>qinfeng.zheng</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>order-service-impl</artifactId>
<dependencies>
<dependency>
<groupId>qinfeng.zheng</groupId>
<artifactId>order-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>qinfeng.zheng</groupId>
<artifactId>member-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
7.3 使用feign客户端调用member服务接口
qinfeng.zheng.api.service.feign.MemberFeign
package qinfeng.zheng.api.service.feign;
import org.springframework.cloud.openfeign.FeignClient;
import qinfeng.zheng.api.service.MemberService;
import qinfeng.zheng.api.service.feign.fallback.MemberFallBack;
/**
* 创建时间: 14:01 2018/9/16
* 修改时间:
* 编码人员: ZhengQf
* 版 本: 0.0.1
* 功能描述:
*/
@FeignClient(name = "client-member",fallback = MemberFallBack.class)
public interface MemberFeign extends MemberService {
}
7.4 hystrix服务保护(使用继承类的方式做服务保护)
qinfeng.zheng.api.service.feign.fallback.MemberFallBack
package qinfeng.zheng.api.service.feign.fallback;
import org.springframework.web.bind.annotation.RequestParam;
import qinfeng.zheng.api.service.feign.MemberFeign;
/**
* 创建时间: 14:46 2018/9/16
* 修改时间:
* 编码人员: ZhengQf
* 版 本: 0.0.1
* 功能描述:
*/
public class MemberFallBack implements MemberFeign {
@Override
public String getMemberInfo(@RequestParam("username") String username) {
return "rpc挂了,还是走本地服务降级方法吧";
}
}
7.5 调用member服务的具体实现
qinfeng.zheng.api.service.impl.OrderServiceImpl
package qinfeng.zheng.api.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import qinfeng.zheng.api.service.OrderService;
import qinfeng.zheng.api.service.feign.MemberFeign;
import qinfeng.zheng.api.service.feign.fallback.MemberFallBack;
/**
* 创建时间: 13:52 2018/9/16
* 修改时间:
* 编码人员: ZhengQf
* 版 本: 0.0.1
* 功能描述:
*/
@RestController
public class OrderServiceImpl extends MemberFallBack implements OrderService {
@Autowired
private MemberFeign memberFeign;
@Override
@RequestMapping("/getInfoFromMemberService") //映射url也可以放在接口方法上面
public String getInfoFromMemberService(String username) {
return memberFeign.getMemberInfo(username);
}
}
7.6 application.yml
###服务启动端口号
server:
port: 8002
###服务名称(服务注册到eureka名称)
spring:
application:
name: client-order
###服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka
## 客户端间隔30s重新读eureka中服务信息
registry-fetch-interval-seconds: 30
# 心跳检测检测与续约时间
# 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
instance:
###Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则)
lease-renewal-interval-in-seconds: 1
####Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己)
lease-expiration-duration-in-seconds: 2
###SpringCloud Feign客户端Http调用工具,默认已经整合了Ribbon负载均衡客户端
###设置feign客户端超时时间
ribbon:
###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
ReadTimeout: 5000
###指的是建立连接后从服务器读取到可用资源所用的时间。
ConnectTimeout: 5000
##开启Hystrix断路器
feign:
hystrix:
enabled: true
#### hystrix禁止服务超时时间,也就是说它不会走fallback方法,如果不配置这里,默认1秒内rpc不响应,就走fallback方法
hystrix:
command:
default:
execution:
# timeout:
### 直接将hystrix禁止服务超时时间禁掉, 这样永远不会走fallback方法了
# enabled: false
isolation:
thread:
#### 设置hystrix的超时时间, 如果2秒内rpc响应,浏览器正常响应,超过2秒走fallback方法
timeoutInMilliseconds: 2000
7.7 创建启动类
qinfeng.zheng.OrderApp
package qinfeng.zheng;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* 创建时间: 14:00 2018/9/16
* 修改时间:
* 编码人员: ZhengQf
* 版 本: 0.0.1
* 功能描述:
*/
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class OrderApp {
public static void main(String[] args){
SpringApplication.run(OrderApp.class, args);
}
}
7.8 启动服务,测试
7.8.1 查看eureka注册中心
7.8.2 接口测试
经测试,浏览器请求order服务的接口,走了服务降级方法,原因是:order-service-impl服务的application.yml中hystrix配置的超时时间是2000ms(它的意思是:如果调用服务接口时,2s内不能正常响应,那么就走本地的服务降级方法),而我们在member-service-impl服务的getMemberInfo接口内模拟业务逻辑,sleep(3000). 所以,对于order端而言,肯定超时,走服务降级方法.
如果我们将order-service-impl服务application.yml中超时时间改成5s,重启服务,再测试
测试接口,响应正常的接口内容,正确!!!
至此,使用SpringCloud搭建微服务项目完成.