精华内容
下载资源
问答
  • 进入Windows的dos界面,ipconfig查看ip的配置,对比相关的以太网适配器,在Windows的网络-更改适配器设置中把对应的以太网适配器禁用就解决了

    进入Windows的dos界面,ipconfig查看ip的配置,对比相关的以太网适配器,在Windows的网络-更改适配器设置中把对应的以太网适配器禁用就解决了

    展开全文
  • 本地环境启动dubbo服务的项目,遇到一个问题,就是项目启动后,本地的dubbo服务会注册到测试环境的zookeeper、nacos上,但是注册的ip地址是只有自己电脑能访问的,就会导致测试环境拿到了我本地的ip地址,但是连接...

    在本地环境启动dubbo服务的项目,遇到一个问题,就是项目启动后,本地的dubbo服务会注册到测试环境的zookeeper、nacos上,但是注册的ip地址是只有自己电脑能访问的,就会导致测试环境拿到了我本地的ip地址,但是连接不上,但是我们想调用测试环境的dubbo服务,又不想自己本地的dubbo服务注册到注册中心。

    记录一下处理方案

    加上dubbo.registry.register=false即可

    1. 背景:我们的dubbo注册中心是集群,有多个,有zk和nacos作为dubbo的注册中心
      spring.dubbo.registry.address = nacos://192.168.220.53:8848;nacos://192.168.220.54:8848;nacos://192.168.220.55:8848|zookeeper://192.168.220.15:2181?backup=192.168.220.15:2182,192.168.220.15:2183

    2. 在dubbo-admin和nacos的控制台可以看到本地注册的ip
      在这里插入图片描述


    3. 处理方案

    点击IDEA的Edit Configurations,在VM options里面加上

    -Ddubbo.registry.register=false;
    

    在这里插入图片描述
    在这里插入图片描述

    备注

    1. VM option :启动时的参数配置,设置启动参数的意义是当启动程序时,程序会优先读取idea的配置参数
    2. 当然我们可以直接application.properties里加上dubbo.registry.register=false,也一样
      但是在VM options设置的参数会覆盖application.properties或application.yaml上的同名参数,好处是不用修改配置文件,如果修改了applicaion.properties在提交代码时候不要提交这行配置
    3. -D"name"=“value” 的-D是指自定义参数
    4. Program agruments :作为main方法的args参数传入
    1. 重新启动项目验证
      重启后可以看到dubbo-admin、nacos上已经没有本地的ip的服务提供者了,但是本地的项目还是可以调用测试环境的dubbo服务
      在这里插入图片描述
    展开全文
  • 服务提供者(payment8004)注册到Zookeeper3 order消费模块80注册zk4.集群方式 zookeeper各种版本下载地址: http://archive.apache.org/dist/zookeeper/ 用Linux启动Zookeeper,然后关闭防火墙,保持Linux和...


    zookeeper各种版本下载地址:
    http://archive.apache.org/dist/zookeeper/

    用Linux启动Zookeeper,然后关闭防火墙,保持Linux和windows能相互ping通。

    1. 服务注册中心Zookeeper(替换Eureka)

    Zookeeper是一个分布式协调工具,可以实现服务注册中心的功能。按照上面的步骤,在虚拟机里通过Docker部署并启动Zookeeper。

    2. 服务提供者(payment8004)注册到Zookeeper

    新建cloud-provider-payment8004模块,修改pom.xml,注意这里新加的spring-cloud-starter-zookeeper-discovery,替换原先的Eureka依赖,其他的没变。

    pom.xml

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    </dependency>
    
    
        <artifactId>cloud-provider-payment8004</artifactId>
        <dependencies>
            <dependency>
                <groupId>com.atguigu.springcloud</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!--SpringBoot整合Zookeeper客户端-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
                <exclusions>
                    <!--先排除自带的zookeeper3.5.3-->
                    <exclusion>
                        <groupId>org.apache.zookeeper</groupId>
                        <artifactId>zookeeper</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!--添加zookeeper3.4.6版本 -->
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.9</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
    </project>
    

    编写application.yml,配置zookeeper的注册地址。

    server:
      port: 8004
    spring:
      application:
        name: cloud-provider-payment # 应用名称
        # zookeeper服务注册中心
      cloud:
        zookeeper:
        #Linux : 192.168.146.129是host;2181是port端口
          connect-string: 192.168.146.129:2181 # Zookeeper的地址和端口号
    

    主启动类

    package com.atguigu.springcloud;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
     
    @SpringBootApplication
    // @EnableDiscoveryClient用于向使用Consul或Zookeeper注册中心时注册服务
    @EnableDiscoveryClient
    public class PaymentMain8004 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8004.class, args);
        }
    }
    

    controller

    省去业务,简单一点演示

    @RestController
    @RequestMapping("/payment")
    @Slf4j
    public class PaymentController {
        @Value("${server.port}")
        private String SERVER_PORT;
        @RequestMapping("/zookeeper")
        public String paymentZK() {
            return "springcloud with zookeeper :" + SERVER_PORT + "\t" + UUID.randomUUID().toString();
        }
    }
    

    启动测试

    此时启动,会报错,因为jar包与我们的zk版本不匹配

    解决:
    修改pom文件,改为与我们zk版本匹配的jar包
    在这里插入图片描述
    此时8004就注册到zk中了

    我们在zk上注册的node是临时节点,当我们的服务一定时间内没有发送心跳
      	那么zk就会`将这个服务的node删除了
    

    进入Zookeeper,执行zkCli.sh,查看注册进来的服务,这里的cloud-provider-payment就是在application.yml里指定的应用名称。

    [zk: localhost:2181(CONNECTED) 0] ls /
    [services, zookeeper]
    [zk: localhost:2181(CONNECTED) 1] ls /services
    [cloud-provider-payment]
    [zk: localhost:2181(CONNECTED) 2] ls /services/cloud-provider-payment
    [f9ef93bc-a060-4b82-8e92-72b195ed7167]
    [zk: localhost:2181(CONNECTED) 3] get /services/cloud-provider-payment/f9ef93bc-a060-4b82-8e92-72b195ed7167
    {"name":"cloud-provider-payment","id":"f9ef93bc-a060-4b82-8e92-72b195ed7167","address":"192.168.139.1","port":8004,"sslPort":null,"payload":{"@class":"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance","id":"application-1","name":"cloud-provider-payment","metadata":{}},"registrationTimeUTC":1591436682645,"serviceType":"DYNAMIC","uriSpec":{"parts":[{"value":"scheme","variable":true},{"value":"://","variable":false},{"value":"address","variable":true},{"value":":","variable":false},{"value":"port","variable":true}]}}
    cZxid = 0xc
    ctime = Sat Jun 06 09:44:43 GMT 2020
    mZxid = 0xc
    mtime = Sat Jun 06 09:44:43 GMT 2020
    pZxid = 0xc
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x172888dc67e0003
    dataLength = 534
    numChildren = 0
    

    在这里插入图片描述
    在这里插入图片描述
    此时生产者已经成功注入Zookeeper了,浏览器访问http://localhost:8004/payment/zookeeper可以请求到结果(当然,这跟Zookeeper并没有关系,只是单纯的访问一下)。
    在这里插入图片描述
    在这里插入图片描述
    现在我们将生产者服务停掉,去Zookeeper查看服务是否还存着,即ls /services/cloud-provider-payment命令。过了一阵子后,由原来的id值,变成了空。所以,**Zookeeper里的服务结点是临时的。**和Eureka不一样,会存90秒,90秒后剔除注册中心。

    这里补充一点关于Zookeeper和Eureka的比较,那么,需要先说一下CAP理论的东西。

    重要点


    CAP理论是分布式系统的

    一个概念,C是Consistency(一致性)的首字母,A是Availability(可用性)的首字母,P是Partition tolerance(分区容错性)的首字母。任何一个分布式系统都不能同时满足CAP,只能满足其中的两个。因为在分布式系统中,分区容错性是必须要保证的,那么A和C就二选一了。

    为什么C和A不能同时存在?

    如果要保证一致性,那么,在一个结点写操作的时候,其他结点必须是锁定读写的,只有完成了数据同步,才能放开读写,锁定期间,其他结点是不可用的。

    如果要保证可用性,那么,在一个结点写操作的时候,其他结点就不能锁定,此时,可能还没有完成同步操作,于是,其他节点读取到的数据就是旧数据,无法保证一致性。

    Zookeeper保证CP(一致性)

    一致性的意思是:写操作后的读操作,必须返回该值。Zookeeper不能保证每次的请求可用性,比如在leader选举时候,集群就是不可用的。选举leader的时间为30-120s,这段时间Zookeeper集群都是不可用的。

    Eureka保证AP(可用性)

    可用性的意思是:集群中各个节点是平等的,如果有几个结点挂掉不影响正常结点的工作,剩余结点依旧可以提供服务,只要有一台Eureka还存着,就能保证注册服务的可用,不过,信息可能不是最新的。


    3 order消费模块80注册到zk

    创建项目

    名字: cloud-consumerzk-order80

    pom.xml和生产者8004一样

    yaml配置文件

    和8004配置一样,就是服务名称不一样

    server:
      port: 80
    spring:
      application:
        name: cloud-consumer-order # 应用名称
      cloud:
        zookeeper:
          connect-string: 192.168.146.129:2181 # Zookeeper的地址
    

    主启动类

    和8004也一样

    package com.atguigu.springcloud;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
     
    @SpringBootApplication
    @EnableDiscoveryClient
    public class OrderZkMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderZkMain80.class, args);
        }
    }
    

    RestTemplate配置类(消费者调用生产者需要用)

    在消费者端调用生产者,这里依旧采用RestTemplate来调用,编写配置类,把RestTemplate注入到容器中。

    package com.atguigu.springcloud.config;
     
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
     
    @Configuration
    public class ApplicationContextConfig {
        @Bean
        @LoadBalanced //负载均衡(轮循)
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    

    controller

    编写调用类,通过RestTemplate,用应用名称访问Zookeeper中注册地址,实现调用。

    package com.atguigu.springcloud.controller;
    @RestController
    @Slf4j
    public class OrderZkController {
        private static final String INVOKE_URL = "http://cloud-provider-payment";
        @Resource
        private RestTemplate restTemplate;
     
        @GetMapping("/consumer/payment/zookeeper")
        public String paymentInfo() {
            return restTemplate.getForObject(INVOKE_URL + "/payment/zookeeper", String.class);
        }
    }
    

    然后启动即可注册到zk

    启动cloud-provider-payment8004和cloud-consumerzk-order80的主启动类,在zkCli.sh下,通过命令ls /services可以查看到两个服务,这就表明服务注册成功了。通过浏览器访问http://localhost:8004/payment/zookeeper和http://localhost/consumer/payment/zookeeper都可以看到信息,其中/consumer/payment/zookeeper请求会调用http://cloud-provider-payment/payment/zookeeper,其中cloud-provider-payment是服务名,从Zookeeper中找到真实的地址,发送/payment/zookeeper请求,此时,就发送到了生产者的controller上面,从而完成请求。
    在这里插入图片描述
    在RestTemplate这个bean注入的时候,我们发现在方法上添加了@LoadBalanced注解,不过,此时只有一台Zookeeper,为什么要加@LoadBalanced注解呢?一台机器怎么做负载均衡?

    之前,对@LoadBalanced的理解停留在:加上它就可以实现负载均衡了,除了负载均衡,它还有将服务名转换成IP的功能,也就是根据服务名cloud-provider-payment,找到192.168.111.144地址。

    我们查看LoadBalancerAutoConfiguration类,在restTemplateCustomizer()方法中,会给RestTemplate加上一个拦截器,从而让RestTemplate成为一个具有负载均衡功能的请求器。这个拦截器是ClientHttpRequestInterceptor类型的,这是一个接口,我们关注它的实现类LoadBalancerInterceptor,找到interceptor()方法,通过getHost()获取服务名,调用this.loadBalancer.execute()方法,发送请求。这里的loadBalancer是LoadBalancerClient类型的,而LoadBalancerClient是一个接口,我们关注它的实现类RibbonLoadBalancerClient,找到execute()方法,根据serviceId(也就是服务名)通过getLoadBalancer()方法,获取一个ILoadBalancer对象,再调用getServer()方法,在getServer()方法中调用chooseServer()方法拿到server(也就是根据服务名获取到ip地址和端口号)。

    4.集群方式

    展开全文
  • 服务治理:Dubbo+ZK 出现的问题-

    千次阅读 2019-01-06 19:35:59
    问题1:提供者的ip注册zk上,ip地址不正确 原因:是服务器有多个网卡,解决的办法就是在配置dubbo时,把host指定上: &lt;dubbo:protocol host="192.168.xx.xx" name="dubbo" port=&...

    服务发布/发现

    问题1:提供者的ip注册到zk上,ip地址不正确

    原因:是服务器有多个网卡,解决的办法就是在配置dubbo时,把host指定上:

    <dubbo:protocol host="192.168.xx.xx" name="dubbo" port="20880" />

    问题2:本地服务注册到服务器dubbo上,注册、消费者调用成功,在dubbo上的IP是本机ip;

    把服务发布到服务器上,注册到服务器dubbo上,注册上去的ip不是服务器的ip,出现ip乱入问题。

    思路1:在dubbo暴露服务的时候指定ip,和问题1解决方案一致

    思路2:去掉服务器的DNS配置,将/etc/resolv.conf 配置文件中的nameserver吸怪成服务器ip

    思路3:在服务器上/etc/hosts,上配置主机名和注册服务的IP。如:192.168.23.180 host2

     

    问题3:开发和测试的时候,绕开注册中心,只测试指定提供者

    服务点对点直连

    使用映射文件${user.home}/dubbo-resolve.properties,用java -Ddubbo.resolve.file=xxx.properties指定文件路径

    文件中加入:

    com.alibaba.xxx.XxxService=dubbo://localhost:20890

     问题4:压测的时候,dubbo线程池溢出

    参考官网,将服务暴露增加几个参数

    dispatcher  threads threadpool

    如;

    <dubbo:protocol name="dubbo" dispatcher="message" threads="500" threadpool="cached" port="${dubbo.protocol.port}" host="${dubbo.protocol.host}"/>

    zookeeper

    问题1:监听不到节点变化怎么办

    思路1:是Session问题吗?

    问题2:zookeeper集群,脑裂怎么办?

     

    待补充。。

    参考:

    https://blog.csdn.net/zhangming1013/article/details/54092782

    展开全文
  • 所以开发项目时,只要连接对于zk的开发环境地址本地不需要启动所有的服务也能互相调用,就好像有三个服务A,B和C,只要B和C都连接zk并且部署到开发环境(或者其他环境),服务A配置好对应的zk信息后不需要在本地启动...
  • 所以开发项目时,只要连接对于zk的开发环境地址本地不需要启动所有的服务也能互相调用,就好像有三个服务A,B和C,只要B和C都连接zk并且部署到开发环境(或者其他环境),服务A配置好对应的zk信息后不需要在本地启动...
  • 服务注册中心 一、SpringCloud整合Zookeeper ...2、Linux装zk,查下zk的ip地址 测试zk能否ping通本地ip 测试本地能否ping同zk的ip 二、服务提供者 1、新建工程cloud-provider-payment8004 2、修改pom.xml文件
  • 可以的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用
  • 可以的,消费者在启动时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。 每次调用时,按照本地存储的地址进行调用 可以的,消费者本地有一个生产者的列表,他会按照列表继续工作,倒是无法从...
  • 是因为启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用,并且: 注册中心对等集群,任意一台宕掉后,会自动切换到另一台 注册中心全部宕掉,...
  • 可以通信的,启动 dubbo 时,消费者会从 zk 拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用;注册中心对等集群,任意一台宕机后,将会切换到另一台; 注册中心全部宕机后,...
  • 一开始之前怎么配置都不能运行,会绕过远程连接的地址直接去...类似于下面这样 ,因为我本地是没有这个zk的 我都是装到虚拟机里面了 Initiating client connection, connectString=127.0.0.1:2182 sessionTimeout=...
  • 连上上面那个地址之后又会多去连接一个127.0.0.1:2181这个zk但是我本地是没有配置这个的就一直报错 <p>2019-04-21 17:46:45.055 INFO 16024 --- [00.58.201:2181)] org.apache.zookeeper.ClientCnxn : Session ...
  • 在之前的版本中,我们抽象出了一个注册中心的接口,并且提供一个本地文件注册中心的实现,这次,我们使用zk 作为注册中心,实现服务的注册与发现,并且监听服务实例状态的变化。 这里我们使用apache curator 作为zk ...
  • 这个是要HBase的regionserver注册到zk,要使用公网ip,是16020这个端口所在的进程也就是regionserver,他往zk注册的时候要用公网ip注册,或者注册host,然后本地绑公网ip。在hbase-site修改hbase.server.hostname....
  • 开源框架面试之Dubbo面试题

    万次阅读 2020-09-28 00:15:42
    文章目录1、Dubbo中...可以通信的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接 口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用;注 册中心对等集群,任意一台宕机后,将会切换到另一台;
  • 在用dubbo做开发的时候,一般都选用zookeeper作为服务注册中心...我一般的做法,是在自己本地,搭建一个单机版的zk,在本地进行开发测试,等到需要时候,再将zk地址切换到公司的zk上。 下面简单说一下zk的单节点...
  • 本地服务注册zkzk上的节点要支持多个,以备之后的集群情况 创建netty的服务器端,并添加相应的handler 通过handler去解析相应,并利用反射执行相应的方法 获取反射调用的结果,再相应给客...
  • 答案是可以的,启动时 dubbo服务端会从服务端拉取接口信息缓存到本地 调用时直接调用本地缓存的地址,但是由于zk挂掉了 是无法注册新的服务的
  • 答:可以通信的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用; 注册中心对等集群,任意一台宕机后,将会切换到另一台;注册中心全部宕机后,...
  • 服务暴露

    2019-06-11 23:55:00
    5. 到zk注册 6. 监听zk 暴露本地服务和暴露远程服务有什么区别? 暴露本地服务:指暴露在一个JVM里面,不用通过zk来进行远程调用。例如:在同一个服务,自己调用自己的接口,就i没必要进行IP连接来通信 暴露远程...
  • dubbo相关

    2019-10-04 11:54:50
    可以的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用 注册中心对等集群,任意一台宕掉后,会自动切换到另一台 注册中心全部宕掉,服务...
  • 【dubbo】面试题

    2018-08-09 22:18:00
    1.面试题:Dubbo中zookeeper做注册中心,如果注册中心集群全都挂掉,发布者和...可以的,消费者在启动时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地(dubbo启动成功后会在本地生成一个cache文件)....
  • dubbo 问题整理

    2017-02-03 15:49:00
    可以的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用 注册中心对等集群,任意一台宕掉后,会自动切换到另一台 注册中心全部宕掉,...
  • Dubbo&Zookeeper面试题

    2021-03-17 22:02:13
    可以通信,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等信息,缓存在本地,每次调用时,按照本地存储的地址进行调用; 注册中心对集群,任意一台宕机后,将会切换到另一台;注册中心全部宕机后,服务的...
  • 2.consumer:通过zkClient 读取privider服务地址注册zkWatch动态本地保存privider服务地址 3.通过(加权)轮询,(加权)随机,hash算法决定调用的服务器 4.通过IO(netty,HttpClient等)调用远程地址返回结果

空空如也

空空如也

1 2 3 4 5
收藏数 81
精华内容 32
关键字:

本地zk注册地址