目录
父子项目
建立父项目,pom修改三个地方
1.地方将依赖放到<dependencyManagement></dependencyManagement>里面
<dependencyManagement></dependencyManagement>
2.第二个地方加入
<packaging>pom</packaging>
3.第三个地方加入moudle这里面放子类项目名称
<modules>
<module>a-app</module>
<module>eureka-server</module>
<module>b-app</module>
<module>spring-cloud-openfeign</module>
<module>spring-cloud-api</module>
<module>spring-cloud-gateway</module>
</modules>
建立子项目pom修改parent,将parent更改为父项目。
<parent>
<groupId>com.wzx</groupId>
<artifactId>spring-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
1.下面的一些版本号用父类的版本号,只有下方的版本号是子类的
<artifactId>spring-cloud-gateway</artifactId>
2.删除子类的<dependencyManagement></dependencyManagement>的全部东西
Eureka
Server配置
#单机
server:
port: 8761 # eureka的默认端口 6379 8080 3306 8848
spring:
application:
name: eureka-server # 应用名称 不要使用特殊字符
eureka: # eureka的配置分为三类 server client 实例的 eureka-server既是服务端又是客户端
server:
eviction-interval-timer-in-ms: 10000 # 服务端间隔多少毫秒做定期删除的操作
renewal-percent-threshold: 0.85 # 续约百分比 超过85%的应用没有和你续约 那么eureka会保护服务 不会剔除任何一个
instance: # 实例的配置
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} # 主机名称 : 应用名称 : 端口号
hostname: localhost # 主机名称 或者服务的ip
prefer-ip-address: true # 以ip的形式显示具体的服务信息
lease-renewal-interval-in-seconds: 5 # 服务实例的续约的时间间隔
client:
service-url:
defaultZone: ${EUREKA_SERVER_URL:http://localhost:8761/eureka}
register-with-eureka: ${REGISTER_WITH_EUREKA:true} # 先将server自己注册自己的开关 关掉
fetch-registry: true
# docker run -p 端口 -d 后台运行 --link 指定网络host文件映射的 -e MYSQL_ROOT_PASSWORD=123456 -v 文件挂载
# 集群
#server:
# port: 8761 # eureka的默认端口 6379 8080 3306 8848
#spring:
# application:
# name: eureka-server # 应用名称 不要使用特殊字符
#eureka:
# client:
# service-url: # 你不写 默认 8761
# defaultZone: http://peer2:8762/eureka,http://peer3:8763/eureka
# instance: # 实例的配置
# instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} # 主机名称 : 应用名称 : 端口号
# hostname: peer1 # 主机名称 或者服务的ip
# prefer-ip-address: true # 以ip的形式显示具体的服务信息
# lease-renewal-interval-in-seconds: 5 # 服务实例的续约的时间间隔
#集群的终极方案
#server:
# port: 8761 # eureka的默认端口 6379 8080 3306 8848
#spring:
# application:
# name: eureka-server # 应用名称 不要使用特殊字符
#eureka:
# client:
# service-url: # 你不写 默认 8761
# defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
# instance: # 实例的配置
# instance-id: ${spring.application.name}:${server.port} # 主机名称 : 应用名称 : 端口号
## hostname: peer1 # 主机名称 或者服务的ip
# prefer-ip-address: true # 以ip的形式显示具体的服务信息
# lease-renewal-interval-in-seconds: 5 # 服务实例的续约的时间间隔
Client配置
server:
port: 8080 # 客户端的端口没有要求
spring:
application:
name: eureka-client-a
# 注册的含义是什么? 就是将自己的一些信息(什么信息ip port...) 发送过去 (发到哪里)
eureka:
client: # 客户端的相关配置
service-url: # 指定注册的地址
defaultZone: http://localhost:8761/eureka
register-with-eureka: true # 可以不往eureka-server注册
fetch-registry: true # 应用是否去拉去服务列表到本地
registry-fetch-interval-seconds: 10 # 为了缓解服务列表的脏读问题 时间越短脏读越少 性能消耗大
instance:
hostname: localhost # 应用的主机名称 最好写主机ip
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
prefer-ip-address: true # 显示ip
lease-renewal-interval-in-seconds: 10 # 示例续约的时间
#server:
# port: 8080 # 客户端的端口没有要求
#spring:
# application:
# name: eureka-client-a
## 注册的含义是什么? 就是将自己的一些信息(什么信息ip port...) 发送过去 (发到哪里)
#eureka:
# client: # 客户端的相关配置
# service-url: # 指定注册的地址
# defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
# register-with-eureka: true # 可以不往eureka-server注册
# fetch-registry: true # 应用是否去拉去服务列表到本地
# registry-fetch-interval-seconds: 10 # 为了缓解服务列表的脏读问题 时间越短脏读越少 性能消耗大
# instance:
# hostname: localhost # 应用的主机名称 最好写主机ip
# instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
# prefer-ip-address: true # 显示ip
# lease-renewal-interval-in-seconds: 10 # 示例续约的时间
Openfeign
GateWay
创建springboot项目,在依赖选择的地方
一共是两个依赖
配置类里面的配置,我采用的是yml格式的配置文件
server:
port: 8083
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: rout01
uri: http://localhost:9091
# uri: http://httpbin.org:80
predicates:
- Path=/a/**
filters:
- StripPrefix=1
- AddRequestParameter=red, blue
- AddRequestParameter=name, blue123
- AddRequestHeader=name,5nifaiea8787808877
- id: rout02
uri: http://www.baidu.com/
predicates:
- Path=/b/**
filters:
- StripPrefix=1
# - Cookie=mycookie,123
- id: rout02
uri: http://localhost:9091/
predicates:
- Path=/c/**
filters:
- StripPrefix=0
- AddRequestParameter=name, blue123
default-filters:
- AddRequestHeader=sign,123 #添加请求头
- AddRequestHeader=company,206 #添加请求头
server: port: 8083 spring: application: name: gateway cloud: gateway: routes: - id: rout01 uri: http://localhost:9091 # uri: http://www.baidu.com predicates: - Path=/a/** filters: - StripPrefix= # - Cookie=mycookie,123 - AddRequestParameter=red, blue - AddRequestParameter=name, blue123 - AddRequestHeader=name,5nifaiea8787808877 default-filters: - AddRequestHeader=sign,123 #添加请求头 - AddRequestHeader=company,206 #添加请求头解析:
uri: http://localhost:9091:跳转的链接
- Path=/a/**:需要拦截的 比如loclahost:8083/a/XXX 这个就会被拦截然后进入uri的链接里面
- StripPrefix=1:拦截的前缀 当前缀是1 链接为 http://localhost:9091
- Cookie=mycookie,123:加入cookie验证,只有当mycookie等于123的时候才会允许进入
全局配置
default-filters:
- AddRequestHeader=sign,123 #添加请求头
- AddRequestHeader=company,206 #添加请求头
全局配置
加入filter类,里面的类继承GlobalFilter, Ordered,这里面的IdUtil是hutto第三方的工具包
public class CustomGlobaFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpRequest request1 = request.mutate().header("traceid", IdUtil.fastUUID()).build();
return chain.filter(exchange.mutate().request(request1).build());
}
@Override
public int getOrder() {
return -1;
}
}
加入配置
@Configuration
public class FilterConfig {
@Bean
public GlobalFilter customFilter(){
return new CustomGlobaFilter();
}
}
局部配置
server: port: 8083 spring: application: name: gateway cloud: gateway: routes: - id: rout01 uri: http://localhost:9091 # uri: http://httpbin.org:80 predicates: - Path=/a/** filters: - StripPrefix=1 - AddRequestParameter=red, blue - AddRequestParameter=name, blue123 - AddRequestHeader=name,5nifaiea8787808877 - id: rout02 uri: http://www.baidu.com/ predicates: - Path=/b/** filters: - StripPrefix=1 # - Cookie=mycookie,123 - id: rout02 uri: http://localhost:9091/ predicates: - Path=/c/** filters: - StripPrefix=1 - AddRequestParameter=name, blue123 - ElapsedTime default-filters: - AddRequestHeader=sign,123 #添加请求头 - AddRequestHeader=company,206 #添加请求头 - ElapsedTime:加入ElasedTime就可以激活局部拦截,这里就是在访问C的时候就会进行拦截,在访问a或b的时候不会进行拦截
在类filter里面写入
//记录接口耗时
public class ElapsedTimeGatewayFilter implements GatewayFilter, Ordered {
private final static String BEAGIN = "begin";
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
exchange.getAttributes().put(BEAGIN, System.currentTimeMillis());
return chain.filter(exchange).then(
Mono.fromRunnable(() -> {
long startTime = exchange.getAttribute(BEAGIN);
long endTime = System.currentTimeMillis();
String url = exchange.getRequest().getURI().getRawPath();
System.out.println(StrUtil.format("{}耗时:{}", url, endTime - startTime));
})
);
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
@Component
public class ElapsedTimeGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
@Override
public GatewayFilter apply(Object config) {
return new ElapsedTimeGatewayFilter();
}
}
Nacos
在docker里面安装Nacos
cd /opt
git clone https://github.com/nacos-group/nacos-docker.git
这里如果没有git组件就会报错
解决方法
dnf install git -y
如果docker没有办法连外网
如何判断是否可以连外网:在docker里面ping www.baidu.com
解决方法
cd /etc/
ls
vi resolv.conf
修改配置文件
再次ping www.baidu.com,ping通过了
dnf install git -y
cd nacos-docker
docker-compose -f example/standalone-derby.yaml up
如果docker没有 docker-compose组件的话
解决方法
dnf install docker-compose
启动nacos
cd /opt
cd nacos-docker
docker-compose -f example/standalone-derby.yaml up
解决方式:
docker ps -a
查找顺序删除
nacos/nacos-server:v2.1.0
prom/prometheus:latest
grafana/grafana:latest
再次启动nacos就可以了
docker-compose -f example/standalone-derby.yaml up
nacos-spring-boot
加入依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.11</version>
</dependency>
配置类里面写入
spring.application.name= nacos-config-demo
nacos.config.server-addr=XXXXXX
spring.application.name= nacos-config-demo
nacos.config.server-addr=XXXXXXXXXXXX:这里是你的nacos的地址 例如 192.168.168.168:8848
nacos-config-demo:这里是你nacos里面新建配置的Data ID
在项目启动类加入一个注解
@NacosPropertySource(dataId = "nacos-config-demo", autoRefreshed = true)
@NacosPropertySource(dataId = "nacos-config-demo", autoRefreshed = true)
nacos-config-demo:是你新建配置的Data ID
加入一个controller类
@RestController
public class ConfigController {
@NacosValue(value = "${girl:拉姆}", autoRefreshed = true)
private String girl;
@GetMapping( "/test")
public String test() {
return girl;
}
}
在nocas里面新建配置
配置内容是你想要相应的内容
新建成功后是上面的样子,这时候我们运行项目。在配置信息对应的情况下,相应的是我们配置内容里面的信息,不然就是我们controller里面value里面的信息
Nacos-spring-cloud
配置类
加入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.1</version>
</dependency>
建立一个bootstrap.properties配置文件,这个配置文件的目的是提前加载里面的配置,以下所有的配置信息都是再bootstrap.properties里面配置
spring.application.name=nacos-cloud-config-demo
spring.cloud.nacos.config.server-addr=XXXXXX
spring.application.name=nacos-cloud-config-demo
spring.cloud.nacos.config.server-addr=XXXXX
nacos-cloud-config-demo:Data ID
cloud:这里是与boot配置不一样的位置
cloud的启动类不需要加入注解
配置类多了一个
@RefreshScope //自动刷新
@RefreshScope 这个注解是自动刷新的作用
@RestController
@RefreshScope //自动刷新
public class ConfigController {
@Value(value="${girl:林青霞}")
private String girl;
@GetMapping(value = "/test")
public String test() {
return girl;
}
}
在nocas里面新建配置,与上面boot一致
新建成功后是上面的样子,这时候我们运行项目。在配置信息对应的情况下,相应的是我们配置内容里面的信息,不然就是我们controller里面value里面的信息。
多配置时
在配置里面加入,就可以在nocas里面进行,这里的后缀要写出来,不然不会导出里面的内容
spring.profiles.active=dev
命名空间
创建命名空间后再新建配置的时候就可以选择命名空间新建
再配置类写入对应的命名空间,就可以访问命名空间里面对应的内容
spring.cloud.nacos.config.namespace=206-wzx
分组
这样就可以分组成功,分组成功后,再新建配置的时候就可以选择分组创建
在配置里加入配置分组就可以访问分组里面对应的内容
spring.cloud.nacos.config.group=wzx-1
服务发现
加入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
加入配置,配置对应的功能是一样的
server.port=8070
spring.cloud.nacos.discovery.server-addr=XXXX
spring.cloud.nacos.discovery.namespace= 206-wzx
spring.cloud.nacos.discovery.group=wzx-1