實現服務之間的調用可以使用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請求,在請求中設置一些內容