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請求,在請求中設置一些內容

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM