springcloud
Spring Cloud
stream流

idea微服务项目导入, maven加载过慢
-
方法1

-
方法2

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>C:\Users\zjk\.m2\repository</localRepository>
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
</servers>
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central</url>
</mirror>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2</url>
</mirror>
<mirror>
<id>ibiblio</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://mirrors.ibiblio.org/pub/mirrors/maven2</url>
</mirror>
<mirror>
<id>jboss-public-repository-group</id>
<mirrorOf>central</mirrorOf>
<name>JBoss Public Repository Group</name>
<url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>google-maven-central</id>
<name>Google Maven Central</name>
<url>https://maven-central.storage.googleapis.com
</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!-- 中央仓库在中国的镜像 -->
<mirror>
<id>maven.net.cn</id>
<name>one of the central mirrors in china</name>
<url>http://maven.net.cn/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
<profile>
<id>repository_set</id>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>public</id>
<name>Public Repository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>public</id>
<name>Public Repository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
</settings>
简单理解就是将不同功能controller分为两个接口供外部使用

链接:https://pan.baidu.com/s/1kOOUESJ7ta68G0FcJN4UyA
提取码:nv2i
--来自百度网盘超级会员V5的分享
微服务的远程调用
问题一,请求订单接口需要返回另一接口的数据
显然需要在订单controller内对用户进行http请求
RestTemplate对象
启动类bean的方式注册restTemplate,在需要使用的地方自动注入即可
@Bean
public RestTemplate restTemplate(){return new RestTemplate();}

Eureka注册中心
处理消费者url问题


Eureka注册中心搭建
maven加载过慢时,参考上述修改setting.xml过程

Eureka注册服务

若对一个服务启动两个实例,直接copy,修改VM options: -Dserver.port=8082(防止端口冲突)
基于服务名(yml文件中spring.application.name)拉取,并采用负载均衡。

Ribbon负载均衡
由下图流程图可知,IRule接口实现负载均衡


懒加载与饥饿加载

clients为列表,也可以采用如下,加载多个服务:
clients:
- x1server
- x2server
Nacos注册中心


Nacos配置管理
项目启动 -> 读取nacos配置 -> 读取合并本地配置
如下生产者服务,nacos按如下yaml文件读取:shop-flashsale配置环境名下的,名为 ${spring.application.name}-${profiles.active}.yml
spring:
application:
name: product-service
cloud:
nacos:
username: nacos
password: nacos
config:
namespace: shop-flashsale
server-addr: 127.0.0.1:8848 #nacos中心地址
file-extension: yaml # 配置文件格式
shared-configs:
- data-id: nacos-discovery-config-dev.yaml
profiles:
active: dev # 环境标识
配置集群属性
对与每个服务,配置完cluster-name再启动,即可分配集训属性


环境隔离,在nacos创建命名空间后,在cloud.nacos.discovery.namespace=命名id
Feign客户端
在上述controller内管理htttp请求


feign日志配置
- yml
feign:
client:
config:
default: # 此处为default则表示全局配置,若为某服务名则特指访问该服务时的配置
loggerLevel: FULL # 日志级别
- java
添加到client局部有效;添加到启动类EnableFeignClients全局有效
public class DefaultFeignConfiguration {
@Bean
Logger.Level loglevel(){
return Logger.Level.FULL;
}
}
feign性能优化


feign最佳实现方案
- 首先创建一个module,命名为feign-api,然后引入feign的starter依赖
- 将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
- 在order-service中引入feign-api的依赖
- 修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包

Gateway网关

Gateway网关搭建


全局过滤器
@Order(-1) // 过滤器顺序,越小优先级越高
@Component // 注册类
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> params = request.getQueryParams();//获取地址参数
String anthorize = params.getFirst("authorization");
if ("admin".equals(anthorize)){
return chain.filter(exchange);
}
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
}
gateway:
routes:
- id: user-service
uri: lb://user-server
predicates: # 判断路径是否符合规则
- Path=/user/**
- id: order-service
uri: lb://order-server
predicates: # 判断路径是否符合规则
- Path=/order/**
filters:
- #1111
discovery:
locator:
enabled: true
default-filters:
- #1111
以上过滤器优先级
- 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
- GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
- 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
- 当过滤器的order值一样时,会按照defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。
跨域问题

Docker容器
镜像管理
docker load -i nginx.tar //加载包
docker images //查看包
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 62d49f9bab67 4 days ago 133MB
redis latest de974760ddb2 7 days ago 105MB
docker pull nginx //拉取nginx
docker save -o redis.tar redis:latest //保存redis的TAG为redis.tar
docker rmi redis:latest //删除redis:latest
容器管理



docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
MQ消息队列
采用springAMQP实现MQ
<!--AMQP依赖,包含RabbitMQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>


广播FanoutExchange



路由DirectExchange


publisher
@Test
public void testMessageSimpleQueue(){
String queueName = "itcast.direct";
String message = "1111";
rabbitTemplate.convertAndSend(queueName,"red",message);
}
consumer
@RabbitListener(bindings = @QueueBinding(
value = @Queue("direct.queue1"),
exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
key = {"red","yellow"}
))
public void DirectListenQueue1Message(String msg){
System.out.println("direct.queue1"+msg);
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue("direct.queue2"),
exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
key = {"red","yellow"}
))
public void DirectListenQueue2Message(String msg){
System.err.println("direct.queue2"+msg);
}
话题TopicExchange

发送接收object类型


Elasticsearch (ES)
创建网络
docker network create es-net
docker load -i es.tar
docker load -i kibana.tar
docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.12.1
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601 \
kibana:7.12.1
-e "cluster.name=es-docker-cluster":设置集群名称-e "http.host=0.0.0.0":监听的地址,可以外网访问-e "ES_JAVA_OPTS=-Xms512m -Xmx512m":内存大小-e "discovery.type=single-node":非集群模式-v es-data:/usr/share/elasticsearch/data:挂载逻辑卷,绑定es的数据目录-v es-logs:/usr/share/elasticsearch/logs:挂载逻辑卷,绑定es的日志目录-v es-plugins:/usr/share/elasticsearch/plugins:挂载逻辑卷,绑定es的插件目录--privileged:授予逻辑卷访问权--network es-net:加入一个名为es-net的网络中-p 9200:9200:端口映射配置
在浏览器中输入:http://192.168.150.101:9200 即可看到elasticsearch的响应结果
--network es-net:加入一个名为es-net的网络中,与elasticsearch在同一个网络中-e ELASTICSEARCH_HOSTS=http://es:9200":设置elasticsearch的地址,因为kibana已经与elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch-p 5601:5601:端口映射配置
IK分词器
# 进入容器内部
docker exec -it elasticsearch /bin/bash
# 在线下载并安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
#退出
exit
#重启容器
docker restart elasticsearch
扩展词停用词
/var/lib/docker/volumes/es-plugins/_data/ik/config
IKAnalyzer.cfg.xml配置文件内容添加:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典-->
<entry key="ext_dict">ext.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典 *** 添加停用词词典-->
<entry key="ext_stopwords">stopword.dic</entry>
</properties>

索引库CRUD
POST /_analyze
{
"analyzer": "ik_smart",
"text": "黑马程序员学习java太棒了!"
}
# 分词粒度会更细
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "黑马程序员学习java太棒了!"
}
# 创建索引库(数据表)
PUT /heima
{
"mappings": {
"properties": {
"info": {
"type": "text",
"analyzer": "ik_smart"
},
"email": {
"type": "keyword",
"index": false
},
"name" :{
"type": "object",
"properties": {
"firstName": {
"type": "keyword"
},
"lastName": {
"type": "keyword"
}
}
}
}
}
}
# 查看索引库
GET /heima
# 删除索引库
DELETE /heima
PUT /heima/_mapping
{
"properties": {
"age":{
"type": "integer"
}
}
}
# 添加实例,仅可添加字段
PUT /heima/_mapping
{
"properties": {
"age":{
"type": "integer"
}
}
}
GET /heima
文档CRUD
# 文档操作(数据)
# 插入文档
POST /heima/_doc/1
{
"info": "黑马程序员java讲师",
"email": "114514@tomcat.cn",
"name": {
"firstname": "alan",
"lastname": "yaeer"
}
}
# 查询文档
GET /heima/_doc/1
# 删除文档
DELETE /heima/_doc/1
# 全量修改(如果没有的文档,他会直接创建)
PUT /heima/_doc/1
{
"info": "黑马程序员java讲师",
"email": "11451@QQ.COM",
"name": {
"firstName": "云",
"lastname" : "赵"
}
}
# 增量修改
POST /heima/_update/1
{
"doc": {
"email": "ZYun@itcast.cn"
}
}
RestClient




浙公网安备 33010602011771号