搭建SpringCloud微服务一整套完整项目(Eureka+Zuul+Hystrix+Feign+Ribbon)
- Eureka
- Zuul
- Hystrix
- Feign
- Ribbon(Zuul 、RestTemplate 、 Fegin都使用了ribbon负载均衡)
首先我的项目结构是一个父工程的pom文件中定义springboot和springcloud的依赖管理,其次让子工程聚合和继承父工程,这样不用每个子工程去重复去引入依赖管理,和不用maven打包的时候一个个的去打包子工程。
现在我们开始我们的搭建吧(我这使用的是springboot2.2.6.RELEASE,springcloud Hoxton.SR3
1.首先创建一个普通的springboot项目不会的看我这片博客
https://blog.csdn.net/weixin_44012722/article/details/105606595
2.导入依赖,并删除src目录因为我们这个父工程的作用就是依赖管理和聚合
2.1父工程的pom文件
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.6.RELEASEversion>
<relativePath/>
parent>
<groupId>com.examplegroupId>
<artifactId>projectartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>projectname>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
<spring-cloud.version>Hoxton.SR3spring-cloud.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
3.创建一个eureka注册中心子模块聚合且继承父工程
3.1 eureka注册中心的pom文件
<parent>
<groupId>com.examplegroupId>
<artifactId>projectartifactId>
<version>0.0.1-SNAPSHOTversion>
parent>
<groupId>com.examplegroupId>
<artifactId>eurekaartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>eurekaname>
<description>Demo project for Spring Bootdescription>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
3.2 在eureka注册中心的启动类添加标注@EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
3.3 在eureka注册中心的配置文件添加配置信息
server:
port: 8083
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:${server.port}/eureka/
spring:
application:
name: eureka
3.4注册中心 工程就完成了 现在启动一下访问测试一下 成功!
4.创建一个子项目向eureka注册中心注册
4.1导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
dependencies>
4.1配置文件
server:
port: 8084
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8083/eureka/
spring:
application:
name: employee
5.随便写一个Controller
@RestController
public class EmployeeController {
@GetMapping("/test")
public String test(){
return "i am employee";
}
}
6.在子项目的启动类标注上@EnableEurekaClient或者@EnableDiscoveryClient二选一
@SpringBootApplication
@EnableEurekaClient
public class EmployeeApplication {
public static void main(String[] args) {
SpringApplication.run(EmployeeApplication.class, args);
}
}
6.启动Eureka服务注册中心,再启动子项目
访问http://localhost:8083
访问http://localhost:8084/test
6.1 Eureka搭建完成!!!
7.Fegin的使用(默认使用了Ribbon自动调用负载均衡作用)
7.1按照上面的步骤 再创建一个新的子项目 依赖 和 配置文件 如下
依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
配置文件
server:
port: 8085
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8083/eureka/
spring:
application:
name: employeetwo
8.创建一个fegin包 在此包创建一个远程调用其他微服务的接口
@FeginClient标注value属性写application.yml里面的spring.application.name
如果调用的服务接口有接收参数一定要带上@RequestParam之类的标注否则会传送不了参数
@FeignClient(value="employee")
public interface EmployeeFegin {
@GetMapping("/test")
public String test();
}
8.1随便写一个Controller调用远程接口
@RestController
public class MyController {
@Autowired
private EmployeeFegin employeeFegin;
@GetMapping("/test")
public String test(){
return employeeFegin.test();
}
}
9.在要使用Fegin的项目的启动类标注@EnableFeignClients启动Fegin服务(调用前提是要知道发现其他服务所以@EnableEurekaClient也是必要的)
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = "com.example.feign")
public class EmployeetwoApplication {
public static void main(String[] args) {
SpringApplication.run(EmployeetwoApplication.class, args);
}
}
10.现在访问第二个子项目测试
访问 http://localhost:8083/ 看服务是否注册成功
访问 http://localhost:8085/test
11. 为了保证eureka的高可用性,我们一般采用两个eureka,相互注册,同步数据,做法很简单 ,我只在这提醒一下,只需注释掉配置文件中的registerWithEureka,fetchRegistry,defaultZone 注册地址填相互两个的eureka注册地址, 而其他微服务注册地址要填写在这两个注册中心的注册地址,用英文逗号隔开
12.Hystrix的使用(普通降级使用)
12.1 在启动类加上@EnableCircuitBreaker或@EnableHystrix
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class EmployeetwoApplication {
public static void main(String[] args) {
SpringApplication.run(EmployeetwoApplication.class, args);
}
}
12.2 在Service实现类,写熔断后调用的回调方法
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeFegin employeeFegin;
@Override
@HystrixCommand(fallbackMethod = "testHystrix")
public String test() {
return employeeFegin.test();
}
private String testHystrix(){
return "i am a testHystrix";
}
}
12.3 在远程成调用的服务写一个Thread.sleep(5000),访问此接口测试
当 服务超过1秒未响应 则调用降级方法 可以在配置文件中配置该配置 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000
13.Hystrix的使用(Feign服务降级使用)
通过Feign调用接口模式,发生延迟异常,默认是不触发Hystrix降级服务,需要开启设置(D版本默认关闭ABC默认打开的)
13.1 配置文件
feign:
hystrix:
enabled: true
13.2 Fegin接口的@FeignClient注解加上fallback属性,此属性的值 就是实现Fegin接口的实现类
@FeignClient(value="employee",fallback = EmployeeHystrix.class)
public interface EmployeeFegin {
@GetMapping("/test")
public String test();
}
13.3 写个实现类实现Fegin接口
注意 这个类要标注@Component否则Spring容器会获取不到这个bean对象
@Component
public class EmployeeHystrix implements EmployeeFegin {
@Override
public String test() {
return "i am a feign hystrix";
}
}
13.4 测试访问
14 Zuul网关
14.1新创建一个子项目,引入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-zuulartifactId>
dependency>
14.2 在启动类标注上注解@EnableZuulProxy和@EnableDiscoveryClient
@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
14.3 配置文件
server:
port: 8086
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8083/eureka/
zuul:
host:
connect-timeout-millis: 15000
socket-timeout-millis: 60000
ribbon:
ReadTimeout: 10000
ConnectTimeout: 10000
14.4启动测试,访问 http://localhost:8086/employee/test , 请求方式为http://localhost:Zuul的端口/服务名/请求资源
到此以上四个SpringCloud配置就算完成的了,还有很多要深入了解的内容,看我另外的博客介绍