Eureka服务注册中心
服务客户端(服务提供方)将服务注册进Eureka服务注册中心,消费者向Eureka服务注册中心获取服务。
1.导入依赖(SpringBoot,SpringCloud-Eureka)
pom.xml
<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
<properties>
<springcloud.version>1.4.6.RELEASE</springcloud.version>
<springboot.version>2.1.4.RELEASE</springboot.version>
</properties>
<!--导入Eureka Server依赖-->
<dependencies>
<!--Eureka-Server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>${springcloud.version}</version>
</dependency>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
</dependency>
</dependencies>
2.配置服务中心
application.yml
server:
port: 7001
# Eureka配置
eureka:
instance:
# Eureka服务端的实例名字
hostname: 127.0.0.1
client:
# 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)
register-with-eureka: false
# fetch-registry如果为false,则表示自己为注册中心,客户端的化为 ture
fetch-registry: false
# Eureka监控页面~
service-url:
#配置其他注册中心,有多个注册中心,地址之间通过,隔开
defaultZone: http://localhost:7002/eureka/ # 单机:http://${eureka.instance.hostname}:${server.port}/eureka/
3.启动服务
application.java
@SpringBootApplication
//开启Eureka服务注册服务
@EnableEurekaServer
public class EurekaServerApplication7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication7001.class,args);
}
}
实际效果
Eureka客户端(服务提供方)
1.导入依赖
pom.xml
<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
<properties>
<springcloud.version>1.4.6.RELEASE</springcloud.version>
<springboot.version>2.1.4.RELEASE</springboot.version>
</properties>
<dependencies>
<!--Eurkea依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>${springcloud.version}</version>
</dependency>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
</dependency>
</dependencies>
2.配置服务
eureka:
instance:
#实例名
instance-id: EurekaProvider8002
client:
service-url:
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/ # Eureka配置:配置服务注册中心地址
server:
port: 8002
info:
#http://localhost:8001/actuator/info 可以看到信息,给Eureka服务中心提供信息
app.name: Dept-8002
spring:
application:
#提供方
name: EurekaProvider #与instance-id存在一对多。Eureka通过name找服务,Ribbon或者Feign通过负载均衡算法找instance-id
3.开启服务
application.java
package com.apex;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
// @EnableEurekaClient 开启Eureka客户端注解,在服务启动后自动向注册中心注册服务
@EnableEurekaClient
//@MapperScan("com.apex.Mapper")
public class EurekaProviderApplication8002 {
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication8002.class,args);
}
}
实际效果
Ribbon
实现Eureka客户端负载均衡。由于本人习惯接口开发,在这不演示Ribbon的配置方式,转向Feign。
Feign
面向社区,面向接口的Eureka客户端负载均衡。通过特定的算法,实现负载均衡。
1.导入依赖
<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
<properties>
<springcloud.version>1.4.6.RELEASE</springcloud.version>
<springboot.version>2.1.4.RELEASE</springboot.version>
</properties>
<!--导入Eureka Server依赖-->
<dependencies>
<!--Feign,包含了Hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${springcloud.version}</version>
</dependency>
<!--Feign服务依赖Eureka服务,所以要多导入Eureka-->
<!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>${springcloud.version}</version>
</dependency>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
</dependency>
</dependencies>
2.配置服务
eureka:
client:
register-with-eureka: false # 不向 Eureka注册自己
service-url: # 从两个注册中心中随机取一个去访问
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
spring:
main:
# 允许重复服务
allow-bean-definition-overriding: true #消费完一轮后,从头开始。
server:
port: 8000
3.启动服务
package com.apex;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
// feign客户端注解,并指定要扫描的包以及配置接口DeptClientService
@EnableFeignClients
public class FeignConsumer80Application {
public static void main(String[] args) {
SpringApplication.run(FeignConsumer80Application.class, args);
}
}
4.调用服务
在Service指定调用的服务接口,以后消费者通过Feign客户端的接口实现获取服务
package com.apex.ServiceImpl;
import com.apex.Bean.Dept;
import com.apex.Bean.JsonObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
/* @FeignClient:微服务客户端注解,value:指定微服务的名字,这样就可以使Feign客户端直接找到对应的微服务
*/
@FeignClient(value = "EUREKAPROVIDER")
public interface DeptClientService {
//指定Eureka客户端(服务提供方)的Api接口。即调用服务提供方的接口获取服务
@GetMapping("/dept/list")
public JsonObject queryAll();
}
Feign接口Controller层
import com.apex.Bean.Dept;
import com.apex.Bean.JsonObject;
import com.apex.ServiceImpl.DeptClientService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class DeptConsumerController {
@Autowired
private DeptClientService deptClientService;
/**
* 消费方根据id查询部门信息
* @param
* @return
*/
@GetMapping("/consumer/dept/list")
public JsonObject list() {
return deptClientService.queryAll();//消费者调用Feign接口,Feign接口调用Service,Service获取服务方接口。最后返回最终的接口
}
}
实际效果
Hystrix
服务熔断机制,当某个方法接口无法提供服务时,采用备选方案(可以选择返回接口奔溃的错误信息或者调用其他接口),防止用户在不断请时服务不断请求响应却又无法返回信息,大量占用资源,也影响用户体验)。
Hystrix一般搭配Feign使用或者Ribbon使用,因为消费方现在通过Feign或者Ribbon获取服务。
而且是在Feign中实现Hystrix,而不是服务提供方中实现。
- 导入依赖
<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
<properties>
<springcloud.version>1.4.6.RELEASE</springcloud.version>
<springboot.version>2.1.4.RELEASE</springboot.version>
</properties>
<!--导入Eureka Server依赖-->
<dependencies>
<!--Feign,包含了Hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${springcloud.version}</version>
</dependency>
<!--Feign服务依赖Eureka服务,所以要多导入Eureka-->
<!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>${springcloud.version}</version>
</dependency>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
</dependency>
</dependencies>
2.配置服务
eureka:
client:
register-with-eureka: false # 不向 Eureka注册自己
service-url: # 从两个注册中心中随机取一个去访问
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/
spring:
main:
# 允许重复服务
allow-bean-definition-overriding: true #消费完一轮后,从头开始。
server:
port: 8000
feign:
hystrix:
enabled: true #开启服务降级
3.启动服务(这里的启动类只开启了Feign)
package com.apex;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
// feign客户端注解,并指定要扫描的包以及配置接口DeptClientService
@EnableFeignClients
public class FeignConsumer80Application {
public static void main(String[] args) {
SpringApplication.run(FeignConsumer80Application.class, args);
}
}
4.调用服务
Service层实现Hystrix
package com.apex.ServiceImpl;
import com.apex.Bean.Dept;
import com.apex.Bean.JsonObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
/* @FeignClient:微服务客户端注解,value:指定微服务的名字,这样就可以使Feign客户端直接找到对应的微服务
fallbackFactory指定服务降级采用的策略
*/
@FeignClient(value = "EUREKAPROVIDER",fallbackFactory = DeptServiceFallBackFactory.class)
public interface DeptClientService {
@GetMapping("/dept/list")
public JsonObject queryAll();
}
在Feign服务微服务下编写 DeptServiceFallBackFactory,熔断降级方法。
package com.apex.ServiceImpl;
import com.apex.Bean.CodeAndMsgEnum;
import com.apex.Bean.Dept;
import com.apex.Bean.JsonObject;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
/**
* 服务降级策略
*
* @author ZJX
* @date 2021/07/21
*/
@Component
public class DeptServiceFallBackFactory implements FallbackFactory<DeptClientService> {
@Override
public DeptClientService create(Throwable throwable) {
return new DeptClientService() {
@Override
public String queryAll() {
return new JsonObject(null, CodeAndMsgEnum.failed.getCodeAndMsg()); //返回访问失败的错误信息
}
};
}
}
实际效果
把服务提供方shutdown掉。
Zuul
路由网管,功能类似于Nginx。能够更加简便调用接口,添加接口配置。让用户无法直接获取服务的提供接口,而是通过Zuul获取,能够更加安全。
1.导入依赖
<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
<properties>
<springcloud.version>1.4.6.RELEASE</springcloud.version>
<springboot.version>2.1.4.RELEASE</springboot.version>
</properties>
<dependencies>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${springboot.version}</version>
</dependency>
<!--zuul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>${springcloud.version}</version>
</dependency>
<!--导入eureka服务依赖是因为要从Eureka中获取服务-->
<!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>${springcloud.version}</version>
</dependency>
</dependencies>
2.配置服务
eureka:
client:
service-url:
#配置Eureka服务中心
defaultZone: http://localhost:7001/eureka
instance:
#实例名
instance-id: ZUULCONSUMER9501
spring:
application:
name: ZUULCONSUMER9501
zuul:
ignored-services: "*" #忽略所有的微服务名称。//不设置的话可以加微服务名称寻找api
prefix: /SpringCloud #所有url的前缀
routes:
#即DeptService绑定了EurekaProvider服务,将此服务的地址绑定成/DeptService/** 其对应下的接口
#结合本文的项目配置,即访问 http://localhost:9501/SpringCloud/DeptService/dept/list,其中、dept/list是Controller下的接口
DeptService.serviceId: EurekaProvider #绑定微服务的服务名,map的形式绑定。前面是key,后面是value
DeptService.path: /DeptService/** #根据key->value的对应关系绑定路径,即通过/DeptService/**访问EurekaProvider服务
server:
port: 9501
3.开启服务
package com.apex;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
//启动Zuul路由
@EnableZuulProxy
public class ZuulConsumer9501Application {
public static void main(String[] args) {
SpringApplication.run(ZuulConsumer9501Application.class,args);
}
}
实际效果
Config服务端
SpringCloud-Config,可以将yml配置文件放在git仓库中,将配置文件和项目分开,因为是分布式应用,当修改某个应用的配置的时候,就不需要到该应用中去修改相关的配置,并且修改之后还有重启应用,相对来说很麻烦。当迁移仓库的位置时,只需要修改server中的配置即可,Client中无需进行任何修改。
并且spring cloud config还支持热更新,当你修改了配置文件中的配置,通过post: http://hostname:port/actuator/refresh 到server 应用操作,可以实现配置热更新,当Client中的类使用了@RefreshScope 注解,那么该类再次使用时,新更改的配置会生效。
Config服务端的作用是与git仓库建立连接,继而让Config客户端从Config服务端获取配置文件
1.导入依赖
<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
<properties>
<springcloud.version>1.4.6.RELEASE</springcloud.version>
<springboot.version>2.1.4.RELEASE</springboot.version>
</properties>
<dependencies>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${springboot.version}</version>
</dependency>
<!--config-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>${springcloud.version}</version>
</dependency>
</dependencies>
2.配置服务
server:
port: 3344
spring:
application:
name: springcloud-config-server
cloud:
config:
server:
git:
uri: https://gitee.com/qq461064002/FIRSTCLOUD-CONFIG.git #git仓库地址
3.启用服务
package com.apex;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
//启动Config服务端服务
@EnableConfigServer
public class ConfigServer3344Application {
public static void main(String[] args) {
SpringApplication.run(ConfigServer3344Application.class,args);
}
}
4.实际效果
访问Config服务端地址/配置文件名-dev.yml即可看见文件内容。
Config客户端
Config客户端是实际需要配置文件的一方,需要从Config服务端获取配置文件信息。
1.导入依赖
<!--SpringBoot和SpringCloud版本号,一般放在父类依赖中-->
<properties>
<springcloud.version>1.4.6.RELEASE</springcloud.version>
<springboot.version>2.1.4.RELEASE</springboot.version>
</properties>
<dependencies>
<!--config客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>${springcloud.version}</version>
</dependency>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${springboot.version}</version>
</dependency>
</dependencies>
2.配置服务
application.yml
#用户级别配置
spring:
application:
name: CONFIGCLIENT3355
boostrap.yml
#系统级别配置
spring:
cloud:
config:
name: application
profile: test #选择yml中环境版本
label: master #选择git分支
uri: http://localhost:3344 #config服务端地址
3.启动服务
package com.apex;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class ConfigServer3344Application {
public static void main(String[] args) {
SpringApplication.run(ConfigServer3344Application.class,args);
}
}
实际效果
获取到了远程仓库的端口配置
远程配置文件的配置信息
spring:
profiles:
#默认是dev配置环境
active: dev
---
#dev配置环境
spring:
profiles: dev
server:
port: 8000
#以---间隔不同的配置环境
---
#test的配置环境
spring:
profiles: test
server:
port: 8090
有对源代码感兴趣的可以去gitee仓库下载学习,git仓库地址 。