第108天学习打卡(SpringBoot window下安装zookeeper he dubbo-admin 服务注册发现实战)

Dubbo 概念

什么是dubbo?

Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

官网地址:快速开始 | Apache Dubbo

image-20210517101324490

服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。

服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需要的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

监控中心(Montor): 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

调用关系说明:

  • 服务容器负责启动,加载,运行服务提供者。
  • 服务提供者在启动时,向注册中心注册自己提供 的服务。
  • 服务消费者在启动时,向注册中心订阅自己所需的服务。
  • 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  • 服务消费者,从提供地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  • 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

window下载安装zookeeper

1.官网地址:Index of /zookeeper (apache.org)

Index of /zookeeper/zookeeper-3.7.0 (apache.org)

image-20210517101341177

注意:因为3.5以后版本的这个tar.gz是未编译的, 要选bin,tar.gz

image-20210517101358187

2.运行/bin/zkServer.cmd,初次运行会报错,没有zoo.cfg配置文件

可能遇到的问题:闪退!

解决方案:编辑zkService.cmd文件末尾添加pause.这样运行出错就不会闪退,会提示错误信息,方便找到原因。

image-20210517101421546

image-20210517101441736

3.修改zoo.cfg配置文件

将conf文件夹下的zoo_sample.cfg复制一份改名为zoo.cfg即可

注意几个重要位置:

dataDir=./ 临时数据存储的目录(可写相对路径)

clientPort = 2181 zookeeper的端口号

修改完成之后再次启动zookeeper

image-20210517101456983

4.使用zkCli.cmd测试

ls /: 列出zookeeper根下保存的所有节点

create -e/kuangshen 123 :创建一个kuangshen节点,值为123

get /kuangshen:获取/kuangshen节点的值

image-20210517101511697

window下载安装dubbo-admin

dubbo本身并不是一个服务软件。它就是一个jar包,能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。

但是为了让用户更好的管理监控众多的dubbo服务,官方提供一个可视化的监控程序dubbo-admin,不过这个监控即使不装也不影响使用。

下载地址:GitHub - apache/dubbo-admin at master

image-20210517101531637

2,进入解压目录dubbo-admin-master\dubbo-admin\src\main\resources\application.properties指定zookeeper地址。

image-20210517101552748

3,在项目目录下打包dubbo-admin

mvn clean package -Dmaven.test.skip=true

image-20210517101607306

image-20210517101622956

打包成功界面

image-20210517101636494

image-20210517101654760

4.执行dubbo-admin\target 下的dubbo-admin-0.0.1-SNAPSHOT.jar

java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

image-20210517101712138

注意:zookeeper的服务一定要打开

执行完毕后,访问http://localhost:7001/,这时需要输入登录账号和密码,默认账号是root,密码是root. 登录成功后,查看界面:

image-20210517101725757

zookeeper:注册中心

dubbo-admin:是一个监控管理后台,查看我们注册了哪些服务,哪些服务被消费了。

Dubbo:jar包

服务注册发现实战

步骤:

前提:zookeeper服务已经开启

1.提供者提供服务

1.导入依赖

​ 2.配置注册中心的地址,以及服务发现名,和要扫描的包

​ 3.在想要被注册的服务上面,增加一个注解@Service

2.消费者如何消费

1.导入依赖

2.配置注册中心的地址,配置自己的服务名

3.从远程注入服务

导入依赖在pom.xml(provider-server)

<!--导入依赖:Dubbo + zookeeper-->

        <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>

<!--        Zkclient-->
        <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>

【新版的坑】zookeeper及其依赖包,解决日志冲突,还需要剔除日志依赖 导入依赖在pom.xml(provider-server)

<!--        日志会冲突-->
<!--        引入zookeeper-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>5.1.0</version>
        </dependency>
       
        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.7.0</version>
            <!--排除这个slf4j-log4j12-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

service

TicketService.java

package com.kuang.service;

public interface TicketService {
    public String getTicket();
}

TicketServiceImpl.java

package com.kuang.service;

import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

//zookeeper:服务注册与发现
@Service//可以被扫描到,在项目一启动就自动注册到注册中心
@Component //使用了Dubbo后尽量不要用Service注解  Component是万能注解
public class TicketServiceImpl implements TicketService{
    @Override
    public String getTicket() {
        return "狂神说Java";
    }
}

application.properties

server.port=8081
# 服务应用名字
dubbo.application.name=provider-server
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 哪些服务要被注册
dubbo.scan.base-packages=com.kuang.service



需要启动的两个cmd:

第一个是zkService.cmd

image-20210517101750966

第二个是在这个路径下启动cmd

image-20210517101807457

image-20210517101819959

执行的命令:java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

最后启动provider-service ,然后访问localhost:7001

image-20210517101836765

在consumer-service的pom.xml中导入的

<!--        导入相关的依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>

        <!--        Zkclient-->
        <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!--        日志会冲突-->
        <!--        引入zookeeper-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>5.1.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.7.0</version>
            <!--排除这个slf4j-log4j12-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

service

TicketService.java

package com.kuang.service;

public interface TicketService { //服务不需要相同,但接口需要相同
    public String getTicket();
}

UserService.java

package com.kuang.service;


import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

@Service //放到容器中
public class UserService {

    //想拿到provider-service提供的票 ,要去注册中心拿到服务
   @Reference //引用  pom坐标,可以定义路径相同的接口名
    TicketService ticketService;

   public void buyTicket(){
       String ticket = ticketService.getTicket();
       System.out.println("在注册中心拿到=>"+ticket);
   }


}

application.properties

server.port=8082
 # 消费者去哪里拿服务      消费者需要暴露自己的名字
dubbo.application.name=consumer-service

#  注册中心的地址,可以在任何电脑上
dubbo.registry.address=zookeeper://127.0.0.1:2181

测试:

package com.kuang;

import com.kuang.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ConsumerServiceApplicationTests {
    @Autowired
    UserService userService;

    @Test
    void contextLoads() {
        userService.buyTicket();
    }

}

回顾

三层架构   + MVC
   架构---->解耦
开发框架
    Spring
       IOC  AOP
           IOC:控制反转
           AOP:切面 (本质,动态代理)
           为了解决什么?不影响业务本来的情况下,实现动态增加功能,大量应用在日志,事务...等等方面
           
       spring是一个轻量级的Java开源框架,容器
       目的:解决企业开发的复杂性问题
       Spring:配置文件十分复杂
    SpringBoot
       SpringBoot并不是新东西,就是Spring的升级版
       新一代JavaEE的开发标准,开箱即用 ->拿过来就可以用
       它自动帮我们配置了非常多的东西,我们拿来即用!
       特性:约定大于配置!
       
随着公司体系越来越大,用户越来越多

微服务架构---->新架构
  模块化,功能化!
  用户模块,支付模块, 签到模块, 娱乐模块,...;
  人越来越多:一台服务器解决不了,再增加服务器!(横向)
  假设A服务器占用98%资源,B服务器只占用10%。  -----需要负载均衡
  
  将原来的整体项目,分成模块化,用户就是一个单独的项目,签到也是一个单独的项目,项目和项目之间需要通信,如何通信?
  用户非常多,而签到十分少! 给用户多一点服务器,给签到少一点服务器。
  
微服务架构问题?
  分布式架构会遇到的四个核心问题?
  1.这么多服务,客户端该如何去访问?
  2.这么多服务,服务之间如何进行通信?
  3.这么多服务,如何治理呢?
  4.服务挂了,怎么办呢?
解决方案:
   SpringCloud,是一套生态,就是来解决以上分布式架构的4个问题
   想使用SpringCloud,必须掌握SpringBoot,因为SpringCloud是基于SpringBoot;
   
1. Spring Cloud NetFlix,出了一套解决方案! 一站式解决方案  我们都可以直接去这里拿
   Api网关, zuul组件    解决上面第一个问题
   Feign -->  HttpClient--->Http的通信方式,同步并阻塞    解决上面第二个问题
   服务注册与发现, Eureka  解决上面第三个问题
   熔断机制, Hystrix   解决上面第四个问题
   
2.Apache Dubbo zookeper, 第二套解决系统
  API: 没有!要么找第三方组件,要么自己实现
  Dubbo是一个高性能的基于Java实现的,RPC通信框架。
  服务注册与发现, zookeeper: 动物园管理者(Hadoop, Hive)
  没有熔断机制:借助了Hystrix的
  
  不完善,Dubbo

3.SpringCloud Alibaba  一站式解决方案

目前,又提出了一种新方案:
   服务网格:下一代微服务标准,Server Mesh
   代表解决方案: istio
   
万变不离其中,一通百通
  1.API网关,服务路由
  2.HTTP, RPC框架,异步调用
  3.服务注册与发现, 高可用
  4.熔断机制,服务降级
  
为什么要解决这个问题?  本质:网络不可靠!

B站学习地址:【狂神说Java】SpringBoot最新教程IDEA版通俗易懂_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

posted @ 2021-04-26 21:10  豆豆tj  阅读(200)  评论(0)    收藏  举报