springcloud

Spring Cloud

stream流

img

idea微服务项目导入, maven加载过慢

  • 方法1
    img

  • 方法2
    img

<?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分为两个接口供外部使用
img

链接:https://pan.baidu.com/s/1kOOUESJ7ta68G0FcJN4UyA

提取码:nv2i

--来自百度网盘超级会员V5的分享

微服务的远程调用

问题一,请求订单接口需要返回另一接口的数据

显然需要在订单controller内对用户进行http请求

RestTemplate对象
img
img

启动类bean的方式注册restTemplate,在需要使用的地方自动注入即可

@Bean
public RestTemplate restTemplate(){return new RestTemplate();}

img

Eureka注册中心

处理消费者url问题
img
img

Eureka注册中心搭建

maven加载过慢时,参考上述修改setting.xml过程
img

Eureka注册服务

img

若对一个服务启动两个实例,直接copy,修改VM options: -Dserver.port=8082(防止端口冲突)

基于服务名(yml文件中spring.application.name)拉取,并采用负载均衡。
img

Ribbon负载均衡

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

懒加载与饥饿加载

img
clients为列表,也可以采用如下,加载多个服务:

clients:
    - x1server
    - x2server

Nacos注册中心

img

img

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再启动,即可分配集训属性
img

img

环境隔离,在nacos创建命名空间后,在cloud.nacos.discovery.namespace=命名id

Feign客户端

在上述controller内管理htttp请求

img

img

feign日志配置

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

feign性能优化

img

img

feign最佳实现方案

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

img

Gateway网关

img

Gateway网关搭建

img

img
全局过滤器

@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的顺序执行。

跨域问题

img

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

容器管理

img

img

img

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>

img

img

广播FanoutExchange

img

img

img

路由DirectExchange

img

img

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

img

发送接收object类型

img

img

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>

img

索引库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

img

posted @ 2024-08-31 09:39  9k  阅读(31)  评论(0)    收藏  举报