springCloud

微服务技术栈

springCloud_第1张图片
springCloud_第2张图片
springCloud_第3张图片
springCloud_第4张图片
springCloud_第5张图片

springcloud 整合技术栈

springCloud_第6张图片
springCloud_第7张图片

服务端调用

springCloud_第8张图片
springCloud_第9张图片
springCloud_第10张图片
springCloud_第11张图片
springCloud_第12张图片
springCloud_第13张图片

注册中心

1.Eureka注册中心

springCloud_第14张图片
springCloud_第15张图片
springCloud_第16张图片
springCloud_第17张图片
springCloud_第18张图片

Eureka搭建步骤(重点)

springCloud_第19张图片
springCloud_第20张图片
springCloud_第21张图片
springCloud_第22张图片

 
      org.springframework.cloud
     spring-cloud-starter-netflix-eureka-client

eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

在这里插入图片描述
springCloud_第23张图片
springCloud_第24张图片
springCloud_第25张图片

注册中心代码

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}
server:
  port: 10086 # 服务端口
spring:
  application:
    name: eurekaserver # eureka的服务名称
eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

order_uservice中
1.在application.yml中

eureka:
  client:
    service-url:  # eureka的地址信息
      defaultZone: http://127.0.0.1:10086/eureka

2…在启动类

/**
     * 创建RestTemplate并注入Spring容器
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

3.在orderService中url可以用别的服务名称替换

@Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate发起http请求,查询用户
        // 2.1.url路径
        String url = "http://userService/user/" + order.getUserId();
        // 2.2.发送http请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

springCloud_第26张图片

springCloud_第27张图片
当有两个相同业务的服务时,需要进行负载均衡
springCloud_第28张图片
springCloud_第29张图片
springCloud_第30张图片
springCloud_第31张图片

默认为ZoneAvoidanceRule

springCloud_第32张图片
在order-service中配置user-service负载均衡规则

userservice:
  ribbon:
    NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule # 负载均衡规则

springCloud_第33张图片

2.Nacos注册中心

1.使用
springCloud_第34张图片
父工程的管理依赖

 
         
           com.alibaba.cloud
             spring-cloud-alibaba-dependencies
                2.2.5.RELEASE
                pom
                import
            

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

springCloud_第35张图片

cloud:
    nacos:
      server-addr: http://47.120.0.38:8848
      discovery:
        cluster-name: BJ
userService:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  # 负载均衡规则
ribbon:
  eager-load:
    enabled: true # 开启饥饿加载
    clients: # 指定饥饿加载的服务名称
      - userservice

nacos分级存储

springCloud_第36张图片
springCloud_第37张图片
springCloud_第38张图片
springCloud_第39张图片
orderService会优先采用本机的服务

application:
    name: orderService
  cloud:
    nacos:
      server-addr: http://47.120.0.38:8848
      discovery:
        cluster-name: BJ
application:
    name: userService
  cloud:
    nacos:
      server-addr: http://47.120.0.38:8848
      discovery:
        cluster-name: SH
会采用我,因为我也是BJ
application:
    name: userService
  cloud:
    nacos:
      server-addr: http://47.120.0.38:8848
      discovery:
        cluster-name: BJ

springCloud_第40张图片
springCloud_第41张图片

userService:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  # 负载均衡规则
ribbon:
  eager-load:
    enabled: true # 开启饥饿加载
    clients: # 指定饥饿加载的服务名称
      - userservice

springCloud_第42张图片
springCloud_第43张图片
springCloud_第44张图片

环境隔离

springCloud_第45张图片
springCloud_第46张图片
springCloud_第47张图片
springCloud_第48张图片
springCloud_第49张图片
springCloud_第50张图片

springCloud_第51张图片
springCloud_第52张图片

nacos与eureka的区别

springCloud_第53张图片
springCloud_第54张图片
springCloud_第55张图片

nacos统一配置管理

springCloud_第56张图片
springCloud_第57张图片
springCloud_第58张图片
springCloud_第59张图片
springCloud_第60张图片


        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        

springCloud_第61张图片
springCloud_第62张图片
springCloud_第63张图片

springCloud_第64张图片

springCloud_第65张图片

多环境配置共享

springCloud_第66张图片

名字为userservice.yaml这个文件一定会被读取
那个dev只能在开发环境被读取到

springCloud_第67张图片
springCloud_第68张图片
springCloud_第69张图片
springCloud_第70张图片

Feign

springCloud_第71张图片

springCloud_第72张图片

springCloud_第73张图片


        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        
在启动类orderServer上添加如下注解
@EnableFeignClients

新建包及其接口文件
按照springmvc的方式书写远程调用方法
springCloud_第74张图片

在orderservice中注入并实现远程接口的调用
springCloud_第75张图片

springCloud_第76张图片
Feign已经集成了ribbon,实现了负载均衡
springCloud_第77张图片
在这里插入图片描述
springCloud_第78张图片
springCloud_第79张图片

feign性能优化

springCloud_第80张图片
springCloud_第81张图片

 
            io.github.openfeign
            feign-httpclient
        
feign:
  client:
    config:
      userService:
        loggerLevel: basic
  httpclient:
    enabled: true   #支持httpClient开关
    max-connections: 200    #最大连接数
    max-connections-per-route: 50   #单个路径的最大连接数

Feign的最佳实践

springCloud_第82张图片
springCloud_第83张图片
springCloud_第84张图片
方式二
springCloud_第85张图片
抽取一个模块
springCloud_第86张图片
在orderService中,加入相关依赖。


            cn.itcast.demo
            feign-api
            1.0
        

springCloud_第87张图片

在orderService启动类中,加入相关注解参数

@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)

springCloud_第88张图片

统一网关Gateway

什么是网关

springCloud_第89张图片
springCloud_第90张图片
springCloud_第91张图片

搭建网关服务

springCloud_第92张图片

 
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        


        
        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
             

springCloud_第93张图片

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: http://47.120.0.38:8848 #nacos地址
    gateway:
      routes:
        - id: userService  #路由标识,必须唯一
          uri: lb://userService  #路由目标地址
          predicates:    #路由断言,判断请求是否符合规则
            - Path=/user/**  #路由断言,判断路径是否以/user/开头,如果符合规则 P要大写
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**

springCloud_第94张图片

网关配置的断言Predicate

springCloud_第95张图片
springCloud_第96张图片
springCloud_第97张图片
springCloud_第98张图片

网关配置的过滤器

springCloud_第99张图片
springCloud_第100张图片
具体的去官网查看
springCloud_第101张图片
springCloud_第102张图片

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: http://47.120.0.38:8848 #nacos地址
    gateway:
      routes:
        - id: userService  #路由标识,必须唯一
          uri: lb://userService  #路由目标地址
          predicates:    #路由断言,判断请求是否符合规则
            - Path=/user/**  #路由断言,判断路径是否以/user/开头,如果符合规则 P要大写
#          filters:
#            - AddRequestHeader=Truth, blue
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
          filters:
            - AddRequestHeader=Truth, blue
      default-filters:
        - AddRequestHeader=Truth,Itcast is freaking awesome!

springCloud_第103张图片

全局过滤器GlobalFilter

springCloud_第104张图片
springCloud_第105张图片
springCloud_第106张图片

 @Order(-1)   //值越小,优先级越高
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
//        exchange.getRequest().getQueryParams().getFirst("authorization")
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap params = request.getQueryParams();
        // 2.获取参数中的 authorization 参数
        String auth = params.getFirst("authorization");
        // 3.判断参数值是否等于 admin
        if ("admin".equals(auth)) {
            // 4.是,放行
            return chain.filter(exchange);
        }
        // 5.否,拦截
        // 5.1.设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // 5.2.拦截请求
        return exchange.getResponse().setComplete();
    }

springCloud_第107张图片
springCloud_第108张图片
springCloud_第109张图片
springCloud_第110张图片
springCloud_第111张图片

网关中的跨域处理

springCloud_第112张图片

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: http://47.120.0.38:8848 #nacos地址
    gateway:
      routes:
        - id: userService  #路由标识,必须唯一
          uri: lb://userService  #路由目标地址
          predicates:    #路由断言,判断请求是否符合规则
            - Path=/user/**  #路由断言,判断路径是否以/user/开头,如果符合规则 P要大写
#          filters:
#            - AddRequestHeader=Truth, blue
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
          filters:
            - AddRequestHeader=Truth, blue
      globalcors:
        add-to-simple-url-handler-mapping: true
        cors-configurations:
          '[/**]':
            allowedOrigins: #允许哪些网站
              - "http://localhost:8090"
              - "http://localhost:8090"
            allowedMethods:
              - "GET"
              - "POST"
              - "DELETE"
            allowedHeaders: "*"  #允许携带请求头信息
            allowedCredentials: true  #是否允许携带cookie
            maxAge: 360000  #这次跨域的有效期1,预检请求的允许时间

Docker

springCloud_第113张图片
springCloud_第114张图片

springCloud_第115张图片
springCloud_第116张图片
springCloud_第117张图片
springCloud_第118张图片
springCloud_第119张图片
springCloud_第120张图片
springCloud_第121张图片
springCloud_第122张图片
springCloud_第123张图片
springCloud_第124张图片
springCloud_第125张图片
springCloud_第126张图片
删除Docker

yum remove docker  \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

安装yum工具

yum install -y yum-utils  device-mapper-persistent-data  1vm2 --skip-broken

设置docker镜像源加速器
去阿里云服务器上看镜像加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://omgw7ydy.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

安装docker-ce
因为ce版为免费版本

 yum install -y docker-ce

查看防火墙状态

systemctl status firewalld

关闭防火墙

systemcctl stop firewalld

开启防火墙

systemctl start firewalld

启动docker

systemctl start docker

重启

systemctl restart docker

springCloud_第127张图片

docker操作命令

springCloud_第128张图片
可以通过 docker --help查看docker命令帮助

拉取一个镜像流程

1.首先去dockerHub中搜索镜像

springCloud_第129张图片
springCloud_第130张图片
springCloud_第131张图片
将镜像导出到磁盘

docker save -o 文件名 镜像名

删除本地镜像需要添加版本信息

docker rmi nginx:latest
如果有在运行的容器要删除再删除镜像

加载本地镜像文件

docker load -i 本地文件名

容器相关命令

springCloud_第132张图片
在dockerHUb官网中可以查看docker镜像的具体使用方法
springCloud_第133张图片
docker容器的参数的具体解析
1.创建容器,并运行容器
springCloud_第134张图片
成功之后返回容器id
然后就可以访问nginx了,云服务器记得开安全组
springCloud_第135张图片

springCloud_第136张图片
2.进入容器
springCloud_第137张图片
springCloud_第138张图片
因为容器内部没有vim指令,如果想要修改容器内文件的内容,需要使用相关操作,不建议修改,如果必须修改,去下面数据卷处找答案。
springCloud_第139张图片
删除容器指令区别于删除镜像指令,没有i
springCloud_第140张图片
springCloud_第141张图片

springCloud_第142张图片

docker run --name myRedis -p 6379:6379 -d redis redis-server --save 60 1 --loglevel warning

进入容器

docker exec -it myRedis bash

退出容器

exit

数据卷

springCloud_第143张图片
springCloud_第144张图片
这个映射,相当于热更新操作,只要容器挂载到数据卷上,就能够实现资源共享
springCloud_第145张图片
查看操作数据卷命令

docker volume --help

创建数据卷

 docker volume create html

显示数据卷

 docker volume inspect html

列出数据卷

docker volume ls

springCloud_第146张图片

springCloud_第147张图片

挂载数据卷

docker run --name myNginx -v html:/usr/share/nginx/html -d nginx

springCloud_第148张图片
springCloud_第149张图片
springCloud_第150张图片
springCloud_第151张图片
挂载数据卷方式二
springCloud_第152张图片

docker run --name mysql  \
-e MYSQL_ROOT_PASSWORD=0071hanxiaolei \
-p 3306:3306 \
-v /temp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d mysql:5.7.42

springCloud_第153张图片

自定义镜像

springCloud_第154张图片
springCloud_第155张图片
springCloud_第156张图片
springCloud_第157张图片
springCloud_第158张图片
springCloud_第159张图片
现在java:8已经不存在了,使用openjdk:8作为基础镜像
springCloud_第160张图片
springCloud_第161张图片

springCloud_第162张图片
在终端中导航到包含Dockerfile的项目目录,并运行以下命令来构建Docker镜像:

docker build -t javaweb .

springCloud_第163张图片
运行镜像

docker run --name web -p 8999:8999 -d javaweb:latest

DockerCompose

springCloud_第164张图片
官网

https://github.com/docker/compose/releases

配置域名解析

echo "192.232.68.133 raw.githubusercontent.com" >>/etc/hosts

下载docker-compose

 curl -L https://github.com/docker/compose/releases/download/2.20.1/docker-compose-`uname -s` \
 -`uname -m` -o /usr/local/bin/docker-compose

查看下载路径

whereis docker-compose

springCloud_第165张图片
给docker-compose添加权限

chmod +x docker-compose

springCloud_第166张图片

springCloud_第167张图片
1.配置网关
springCloud_第168张图片

springCloud_第169张图片
2.其他userService与orderService都与网关相同
springCloud_第170张图片

Docker镜像仓库

springCloud_第171张图片
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://47.120.0.38:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker

查看docker-compose是否安装成功

docker-compose -v

然后在tmp目录下创建registry-ui文件

mkdir registry-ui

然后在registry-ui中新建文件docker-compose.yml

 touch docker-compose.yml

docker-compose.yml里面添加内容为

version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=某某某的私有仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

springCloud_第172张图片

springCloud_第173张图片
生成本地镜像版本

docker tag nginx:latest 47.120.0.38:8080/nginx:1.0

推送镜像

docker push 47.120.0.38:8080/nginx:1.0

拉取镜像

docker pull 47.120.0.38/nginx:1.0

springCloud_第174张图片
springCloud_第175张图片

RabbitMQ

springCloud_第176张图片

同步调用

springCloud_第177张图片
同步调用会请求等待,造成请求时间过长
springCloud_第178张图片
springCloud_第179张图片
springCloud_第180张图片

异步调用

springCloud_第181张图片
springCloud_第182张图片
springCloud_第183张图片
springCloud_第184张图片
springCloud_第185张图片

springCloud_第186张图片

springCloud_第187张图片
springCloud_第188张图片

RabbitMQ的安装

docker run -d --hostname my-rabbit --name rabbit \
 -p 5672:5672 -p 15672:15672 -e \ 
 RABBITMQ_DEFAULT_USER=root  \
 -e RABBITMQ_DEFAULT_PASS=0071hanxiaolei  \
 rabbitmq:3-management

若访问不了控制台

进入rabbitmq容器内部,然后执行
rabbitmq-plugins enable rabbitmq_management

cd /etc/rabbitmq/conf.d/

echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf

常见的MQ消息模型

springCloud_第189张图片

HelloWord案例

springCloud_第190张图片

public class PublisherTest {
    @Test
    public void testSendMessage() throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("47.120.0.38");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("root");
        factory.setPassword("0071hanxiaolei");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.发送消息
        String message = "hello, rabbitmq!";
        channel.basicPublish("", queueName, null, message.getBytes());
        System.out.println("发送消息成功:【" + message + "】");

        // 5.关闭通道和连接
        channel.close();
        connection.close();

    }
}
public class ConsumerTest {

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("47.120.0.38");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("root");
        factory.setPassword("0071hanxiaolei");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.订阅消息
        channel.basicConsume(queueName, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:【" + message + "】");
            }
        });
        System.out.println("等待接收消息。。。。");
    }
}

springCloud_第191张图片

springAMQP

springCloud_第192张图片
springCloud_第193张图片
springCloud_第194张图片


        org.springframework.boot
       spring-boot-starter-amqp

springCloud_第195张图片

spring:
  rabbitmq:
    host: 47.120.0.38
    port: 5672
    username: root
    password: 0071hanxiaolei
    virtual-host: /
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAmqpTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSendMessageSimpleQueue(){
        String queueName="simple.queue";
        String message="hello word";
        rabbitTemplate.convertAndSend(queueName,message);
    }
}

springCloud_第196张图片

springCloud_第197张图片

spring:
  rabbitmq:
    host: 47.120.0.38
    port: 5672
    username: root
    password: 0071hanxiaolei
    virtual-host: /
@Component
public class SpringAmqpListener {
    @RabbitListener(queues = "simple.queue")
    public void listenerSimpleQueue(String arg){
        System.out.println("消费者接受到simple.queue的消息:"+arg);

    }
}

springCloud_第198张图片

Work Queue

springCloud_第199张图片
springCloud_第200张图片
多个消费者,会进行消息队列的预取,但是预取完之后做不完,会产生消息的堆积
springCloud_第201张图片

spring:
  rabbitmq:
    host: 47.120.0.38
    port: 5672
    username: root
    password: 0071hanxiaolei
    virtual-host: /
    listener:
      direct:
        prefetch: 1

springCloud_第202张图片

消息的订阅与发布

springCloud_第203张图片

Fanout广播

springCloud_第204张图片
springCloud_第205张图片
springCloud_第206张图片
springCloud_第207张图片

@Configuration
public class FanoutConfig {
    //声明一个交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        return  new FanoutExchange("itcast.fanout");
    }

    //声明一个队列
    @Bean
    public Queue fanoutQueue1(){
        return new Queue("fanout.queue1");
    }

    //声明一个队列
    @Bean
    public Queue fanoutQueue2(){
        return new Queue("fanout.queue2");
    }

    //绑定队列1到交换机
    @Bean
    public Binding fanoutBinding1(Queue fanoutQueue1,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }

    //绑定队列2到交换机
    @Bean
    public Binding fanoutBinding2(Queue fanoutQueue2,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
    }
}

springCloud_第208张图片

 @RabbitListener(queues = "fanout.queue1")
    public void listenerFanoutQueue1(String arg) throws InterruptedException {
        System.err.println("消费者1.....接受到fanout.queue1的消息:"+arg+"*******"+ LocalTime.now());
    }

    @RabbitListener(queues = "fanout.queue2")
    public void listenerFanoutQueue2(String arg) throws InterruptedException {
        System.err.println("消费者2.....接受到fanout.queue2的消息:"+arg+"*******"+ LocalTime.now());
    }

springCloud_第209张图片

public void testSendFanoutExchange(){
        //交换机名称
        String exchangeName="itcast.fanout";
        //消息
        String message="hello one";
        //发送消息
        rabbitTemplate.convertAndSend(exchangeName,"",message);

    }

springCloud_第210张图片
springCloud_第211张图片
springCloud_第212张图片
springCloud_第213张图片

Direct路由

springCloud_第214张图片

springCloud_第215张图片
springCloud_第216张图片

/**
     * direct
     * @param arg
     */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue1"),
            exchange = @Exchange(name = "itcast.direct",type = ExchangeTypes.DIRECT),
            key = {"red","blue"}
    ))
    public void listenerDirectQueue(String arg){
        System.out.println("消费者red与blue.....接受到direct.queue1的消息:"+arg);

    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue2"),
            exchange = @Exchange(name = "itcast.direct",type = ExchangeTypes.DIRECT),
            key = {"red","yellow"}
    ))
    public void listenerDirectQueue2(String arg){
        System.out.println("消费者red与yellow.....接受到direct.queue2的消息:"+arg);
    }

springCloud_第217张图片

@Test
    public void testSendDirectExchange(){
        //交换机名称
        String exchangeName="itcast.direct";
        //消息
        String message="hello yellow";
        //发送消息
        rabbitTemplate.convertAndSend(exchangeName,"yellow",message);

    }

springCloud_第218张图片

Topic主题

springCloud_第219张图片

springCloud_第220张图片

 /**
     * topic
     */

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue1"),
            exchange = @Exchange(name = "itcast.topic",type = ExchangeTypes.TOPIC),
            key = "china.#"
    ))
    public void listenerTopicQueue(String arg){
        System.out.println("china的所有消息"+arg);

    }
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue1"),
            exchange = @Exchange(name = "itcast.topic",type = ExchangeTypes.TOPIC),
            key = "china.sjz"
    ))
    public void listenerTopic2Queue(String arg){
        System.out.println("china.sjz的消息"+arg);

    }

springCloud_第221张图片

@Test
    public void testSendTopicExchange(){
        //交换机名称
        String exchangeName="itcast.topic";
        //消息
        String message="我在石家庄学习springCloud";
        //发送消息
        rabbitTemplate.convertAndSend(exchangeName,"china.sjz",message);

    }
    @Test
    public void testSendTopic2Exchange(){
        //交换机名称
        String exchangeName="itcast.topic";
        //消息
        String message="我在中国学习springCloud";
        //发送消息
        rabbitTemplate.convertAndSend(exchangeName,"china",message);

    }

消息转换器

springCloud_第222张图片

springCloud_第223张图片


            com.fasterxml.jackson.core
            jackson-databind
   
  @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    @Test
    public void testSendObjectQueue(){
        Map stringObjectHashMap = new HashMap<>();
        stringObjectHashMap.put("柳岩","柳岩");
        stringObjectHashMap.put("age",18);
        rabbitTemplate.convertAndSend("object.queue",stringObjectHashMap);
    }

springCloud_第224张图片

 @Bean
    public Queue objectQueue(){
        return new Queue("object.queue");
    }
@RabbitListener(queues = "object.queue")
    public void listenerObjectQueue(Map msg){
        System.out.println(msg);

    }

springCloud_第225张图片

Elasticsearch

什么是elasticsearch

springCloud_第226张图片
springCloud_第227张图片
springCloud_第228张图片
springCloud_第229张图片
springCloud_第230张图片
springCloud_第231张图片
springCloud_第232张图片

倒排索引

springCloud_第233张图片
springCloud_第234张图片
springCloud_第235张图片
springCloud_第236张图片

文档

springCloud_第237张图片

索引

springCloud_第238张图片

概念对比

springCloud_第239张图片

架构

springCloud_第240张图片
springCloud_第241张图片

安装elasticsearch

部署单点es
因为我们还需要部署kibana,因此我们需要让es和kibana容器互联。这里先创建一个网路

 docker network create es-net

加载镜像

docker load -i es.tar
docker pull elasticsearch

启动elasticsearch

 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:latest

访问9200端口
springCloud_第242张图片

安装kibana

docker run -d --name kibana \
-e ELASTICSEARCH_URL=http://es:9200 \
--network=es-net -p 5601:5601 kibana:latest

访问5601
springCloud_第243张图片

分词器

springCloud_第244张图片
springCloud_第245张图片
处理这种中文分词器我们使用IK分词器
springCloud_第246张图片
离线安装ik分词器
安装插件需要知道elasticsearch的plugins目录位置,而我们使用了数据卷挂载,因此需要查看elasticsearch的数据卷目录,通过以下命令查看

docker volume inspect es-plugins

springCloud_第247张图片
将下载好的ik分词器上传到该目录下
springCloud_第248张图片
重启es模块

docker restart es

测试分词效果
springCloud_第249张图片
两种分词模式

  • ik_smart:最少切分

  • ik_max_word:最细切分

GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": "黑马程序员学习java太棒了"
}

显示结果

{
  "tokens" : [
    {
      "token" : "黑马",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "程序员",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "程序",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "员",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "CN_CHAR",
      "position" : 3
    },
    {
      "token" : "学习",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "java",
      "start_offset" : 7,
      "end_offset" : 11,
      "type" : "ENGLISH",
      "position" : 5
    },
    {
      "token" : "太棒了",
      "start_offset" : 11,
      "end_offset" : 14,
      "type" : "CN_WORD",
      "position" : 6
    },
    {
      "token" : "太棒",
      "start_offset" : 11,
      "end_offset" : 13,
      "type" : "CN_WORD",
      "position" : 7
    },
    {
      "token" : "了",
      "start_offset" : 13,
      "end_offset" : 14,
      "type" : "CN_CHAR",
      "position" : 8
    }
  ]
}
GET /_analyze
{
  "analyzer": "ik_smart",
  "text": "学习java太棒了"
}
{
  "tokens": [
    {
      "token": "学习",
      "start_offset": 0,
      "end_offset": 2,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "java",
      "start_offset": 2,
      "end_offset": 6,
      "type": "ENGLISH",
      "position": 1
    },
    {
      "token": "太棒了",
      "start_offset": 6,
      "end_offset": 9,
      "type": "CN_WORD",
      "position": 2
    },
    {
      "token": "eeee",
      "start_offset": 9,
      "end_offset": 13,
      "type": "ENGLISH",
      "position": 3
    }
  ]
}

分词扩展
springCloud_第250张图片
springCloud_第251张图片
文件位置
springCloud_第252张图片

/var/lib/docker/volumes/es-plugins/_data/ik/config/IKAnalyzer.cfg.xml

其中ext.dic是添加扩展词,同级目录下没有该文件,新建一个
其中stopword.dic是忽略的词,同级目录下存在,往里面加相应的词语即可




	IK Analyzer 扩展配置
	
	ext.dic
	 
	stopword.dic
	
	
	
	

springCloud_第253张图片
springCloud_第254张图片

索引库操作

springCloud_第255张图片
springCloud_第256张图片

创建索引库

每个版本的创建方式不同,添加方式也不同,这里版本是5.6.8
springCloud_第257张图片

PUT heima3
{
  "mappings": {
    "person": {
      "properties": {
        "info": {
          "type": "text",
          "analyzer": "ik_smart"
        },
        "email": {
          "type": "keyword",
          "index": false
        },
        "name": {
          "type": "object",
          "properties": {
            "firstName": {
              "type": "keyword"
            },
            "lastName": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

查看删除索引库

springCloud_第258张图片

修改索引库

不能够修改已有索引库,只能添加新字段。
springCloud_第259张图片
向索引库中添加字段

PUT /heima/person/_mapping
{
  "properties": {
    "age1": {
      "type": "long"
    }
  }
}

springCloud_第260张图片

添加文档

springCloud_第261张图片
如果以后版本不同,请查看不同版本如何使用

POST /hiema/person/1
{
  "info":"黑马此程序黑马此程序黑马",
  "email":"9100",
  "name":{
    "lastNAme":"wg",
    "firstName":"bbb"
  }
}

查看删除文档

springCloud_第262张图片

你可能感兴趣的:(spring,cloud,java,spring)