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请求,在请求中设置一些内容

原文地址:https://www.cnblogs.com/feixiangdecainiao/p/10850558.html