• eureka服务注册中心


    实现服务之间的调用可以使用restTemplate()函数实现服务之间的调用,但是存在硬编码问题,并且调用者需要有被调用者的实体

    格式:SomeClass someClass=restTemplate("someurl",SomeClass.class);

    eureka实现服务的治理:

    是一个服务的注册中心,自己也是一个独立的服务,对外暴露自己的地址

    提供者:启动后向eureka注册自己的地址,以及自己提供的服务

    消费者:向eureka订阅服务,eureka会将对应服务的所有地址列表发送给消费者,并且定期更新。

                  最后通过提供的地址列表访问对应的服务(不是消费者和提供者之间的直接通信)

    eureka的基本原理图

    基本使用

    @SpringBootApplication
    @EnableEurekaServer
    public class LyRegistry {
        public static void main(String[] args) {
            SpringApplication.run(LyRegistry.class);
        }
    }

    eureka的server端配置信息

    官方默认的端口是8761,因为eureka自己也是一个服务,所以eureka需要自己向自己注册

    server:
        port: 10086    //微服务的端口
    spring:
      application:
        name: eureka-server eureka: client: service
    -url: defaultZone: http://127.0.0.1:10086/eureka //注册的地址
         registry-with-eureka: false //设置自己不注册自己
      instance:
        prefer-ip-address: true
        ip-address: 127.0.0.1 //将IP地址写死,下次启动加快,因为他会去找相应的IP
        lease-renewal-interval-in-seconds: 30 //心跳间隔
        lease-expiration-duration-in-seconds: 90 服务挂掉的时间

    源码中service-url是个map,所以defaultZone的配置方式就是map的配置方式。

    这里需要自己注册自己的原因是,默认的eureka服务的端口是8761,这这里我们将服务的端口号改成10086,所以eureka的默认注册地址失效,所以现在自己手动配置。

    eureka的client使用

    @SpringBootApplication
    @EnableDiscoveryClient
    public class LyRegistry {
        public static void main(String[] args) {
            SpringApplication.run(LyRegistry.class);
        }
    }

    这个注解可以发现多种注册服务不仅仅是eureka的,官方推荐

    同一个服务的不同应用叫作实例(多个Tomcat)

    可以使用discoverClient获得服务的实例列表,返回list列表,通过实例可以获得IP和地址,接着使用上面的restTemplate()获得相应实例中的相应的服务。但是这种每次都是访问一个服务,实现不了负载均衡。

    eureka高可用

    eureka服务之间的相互配置

    如果启动多个eureka集群,实现方式就是eureka服务之间相互注册,注册的时候,注册地址的端口号不在是自己的端口号,是别的eureka服务的注册,注册地址写多个eureka服务器的地址

    同理,服务的都要向eureka服务器注册,即注册的地址写上多个。

    server:
      port: 10086
    spring:
      application:
        name: eureka-server
    eureka:
      client:
        service-url: http://localhost:10087/eureka,http://localhost:10088/eureka
        fetch-registry: true
        registry-fetch-interval-seconds: 30
      instance:
        prefer-ip-address: true
        ip-address: localhost
        lease-renewal-interval-in-seconds: 30
        lease-expiration-duration-in-seconds: 90

    服务端

    server:
    port: 10086
    spring:
    application:
    name: user-service #服务的名字
    eureka:
    client:
    service-url:
    defaultZone: http://localhost:10086/eureka #注册的eureka服务地址
    registry-fetch-interval-seconds: 30 #默认拉取服务列表的时间间隔
    instance:
    prefer-ip-address: true
    ip-address: localhost
    lease-renewal-interval-in-seconds: 30 #心跳周期
    lease-expiration-duration-in-seconds: 90 #挂掉的时间
    user-service:
    ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置负载均衡的算法

    服务中的心跳默认是30秒的。默认90秒收不到心跳就表示服务挂了eureka服务列表的拉取周期默认也是30秒,是打开的,也可以关闭

    server端

    server:
      port: 10086
    spring:
      application:
        name: eureka-server
    eureka:
      client:
        service-url: http://localhost:10087/eureka,http://localhost:10088/eureka
        fetch-registry: true     #不向自己注册
      server:
        eviction-interval-timer-in-ms: 600000    #定时清除时间
        enable-self-preservation: true  #自我保护,默认打开
      instance:
        prefer-ip-address: true
        ip-address: localhost

    失效剔除和自我保护


    负载均衡Ribbon,

    微服务导入Ribbon

    负载均衡的算法:随机、轮询、hash(相当于给每个用户分配相同的服务器)、最小访问

    使用:1、找到启动类,找到RestTemplate对象的定义的地方直接在@bean注解上加上@LoadBalanced注解

    @EnableEurekaServer
    @SpringBootApplication
    public class starter {
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
        public static void main(String[] args) {
            SpringApplication.run(starter.class);
        }
    }

       2、使用

    String url="http://user-service/user/"+id;  //这里的id是请求路径后面的参数
    User user= restTemplate.getForObject(url,User.class);

    Ribbon内置拦截器,拦截所有的restTemplate请求,在请求中设置一些内容

  • 相关阅读:
    linux 常用命令
    restframeword之视图,解析器
    restframework之序列化
    restframeword之APIview
    MongoDB
    redis
    mysql优化
    (java)图片像素的操作
    关于java AudioInputStream播放短音频没声音的问题
    java向文件中追加内容的一种简单方式
  • 原文地址:https://www.cnblogs.com/feixiangdecainiao/p/10850558.html
Copyright © 2020-2023  润新知