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:
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>
|
负载均衡
- 需要将当前服务注册到 eureka 中
- 利用 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中负载均衡实现类
随机和轮询(默认)

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>
|
环境隔离
- 在网页中创建新的命名空间,默认创建的项目都是再public中
- 在项目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 优先度更高可对项目个性化设置


代码中使用
1 2 3 4 5 6 7 8 9 10
| @Value(value = "${pattern:test}") private String name;
@GetMapping("/test") public void test() { 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
|
性能优化
配置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 uri: 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查询对应记录

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:该字段的子字段
。。。
。。。