Eureka

搭建eureka服务

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
server:
port: 10086

eureka:
client:
fetch-registry: false
service-url:
defaultZone: http://127.0.0.1:10086/eureka
spring:
main:
banner-mode: off
application:
name: eureka-server

maven

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

访问url:

1
http://127.0.0.1:10086/

eureka服务注册

application

1
2
3
4
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka

maven

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

负载均衡

  1. 需要将当前服务注册到 eureka 中
  2. 利用 restTemplate 加上@LoadBalanced 注解

如何使用restTemplate

1
2
3
4
5
6
@GetMapping("/test")
public void test() {
String url = "http://userService/hello";
ResponseEntity<String> forEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
System.out.println(forEntity.getBody());
}

maven

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

spring-cloud中负载均衡实现类

随机和轮询(默认)

image-20231120170349159

Nacos

maven

1
2
3
4
5
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>

环境隔离

  1. 在网页中创建新的命名空间,默认创建的项目都是再public中
  2. 在项目application.yml中 配置 namespace 为 创建的命名空间的uuid

Docker 中创建nacos容器

docker run -it -e PREFER_HOST_MODE=ip -e MODE=standalone -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.112.1 -e MYSQL_SERVICE_PORT=10101 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=root -p 8848:8848 –name nacos nacos/nacos-server:v2.2.3

设置临时实例

1
2
3
4
5
spring:
cloud:
nacos:
discovery:
ephemeral: false

配置管理

为服务统一配置管理,实现热更

引入依赖

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

bootstrap.yaml配置(和application.yaml文件在一起)

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: d40ed8ad-c4b1-40e5-b70b-27dce9d83ce9
config:
file-extension: yaml
namespace: d40ed8ad-c4b1-40e5-b70b-27dce9d83ce9
profiles:
active: dev
application:
name: admin

文件名字

服务名称-dev.yaml

bootstrap.yml 优先度更高可对项目个性化设置

image-20231120205817187

image-20231120214429711

代码中使用

1
2
3
4
5
6
7
8
9
10
@Value(value = "${pattern:test}")
private String name;

@GetMapping("/test")
public void test() {
// String url = "http://userService/hello";
// ResponseEntity<String> forEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
// System.out.println(forEntity.getBody());
System.out.println(name);
}

优先度

服务名-profile.yaml > 服务名.yaml > 本地配置

Feign

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

注解

1
2
3
@EnableFeignClients // 放在启动类上

@FeignClient(服务名) (接口上)

接口代码

1
2
3
4
5
6
@FeignClient("admin")
@Component
public interface AdminApi {
@GetMapping("/admin/test")
public String adminTest();
}

日志

1
2
3
4
5
feign:
client:
config:
default:
loggerLevel: full # 尽量用basic或者none

性能优化

配置httpclient 连接个数

1
2
3
4
5
feign:
httpclient:
max-connections: 500
enabled: true
max-connections-per-route: 50

抽离api层

1、抽离 api

2、提供者和消费者都依赖这个api模块

3、消费者启动类加上 @EnableFeignClients(clients = AdminApi.class)

Gateway

身份权限校验

服务路由、负载均衡

请求限流

依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

application

1
2
3
4
5
6
7
8
9
10
11
spring:
cloud:
nacos:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: admin-service # 唯一路由id
uri: lb://admin # lb 负载均衡, admin为服务名
predicates:
- Path=/admin/** # 请求路由匹配
- After=2017-01-20T17:42:47.789-07:00[America/Denver] # 在什么时间前能访问

过滤器

对路由进行加工处理,例如请求头和响应头进行处理添加删除参数等

1、filters 仅对当前路由有效

2、default-filters 对所有都有效

GlobalFilter

与filter作用一致,但是需要实现这个接口实现功能(可用于权限认证)

1
2
3
4
5
6
7
8
9
10
11
12
13
@Component
@Order(-1)
public class AuthConfig implements GlobalFilter {
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
List<String> strings = queryParams.get("auth");
if (strings.equals("admin")) {
return chain.filter(exchange);
}
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
}

过滤器执行顺序

根据order进行排序,如果order一样则 默认过滤器 > 路由过滤器 > 全局过滤器

跨域问题

浏览器请求服务器跨域,被浏览器拦截。需要再服务端CORS放行跨域

elasticseach

分布式搜索引擎,从海量数据中找到需要的内容

es为什么快

正排索引:一般根据id建立索引,通过这个索引来查找到对应记录

倒排索引:通过词条(需要查询的条件)来建立索引,然后通过这个索引找到对应的记录id(文档),再通过这个记录id查询对应记录

image-20231129122255897

docker 命令

1
docker network create somenetwork
1
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name es --privileged --network es-net elasticsearch:7.17.12

安装kibana

1
docker run -d -e ELASTICSEARCH_HOSTS=http://es:9200 --name kibana --network=es-net -p 5601:5601 kibana:7.17.12

在线安装生词器

https://github.com/medcl/elasticsearch-analysis-ik

找到对应es版本拉去到plugins目录中,如果没有对应版本就绪要修改ik插件中的properties文件

elasticsearch.version = ????

1
2
3
4
5
6
7
8
9
 GET _analyze
{
"text": "你真的太崩了",
"analyzer": "ik_max_word"
}


ik_smart、
ik_max_word

mapping属性

对索引库进行约束,常见mapping属性包括:

type:字段数据类型: 字符串(text)、keyword(精确值、例如品牌、国家、IP地址表唯一的)

​ 数值:long、integer、short、byte、double、float。。

​ 布尔:boolean

​ 日期:date

index:是否创建索引,默认为true

analyzer:使用那种分词器

properties:该字段的子字段

。。。

。。。