什么叫服務(wù)與注冊(cè)中心?
服務(wù)注冊(cè)中心是服務(wù)實(shí)現(xiàn)服務(wù)化管理的核心組件,類似于目錄服務(wù)的作用,主要用來(lái)存儲(chǔ)服務(wù)信息,譬如提供者 url 串、路由信息等。服務(wù)注冊(cè)中心是微服務(wù)架構(gòu)中最基礎(chǔ)的設(shè)施之一。注冊(cè)中心可以說(shuō)是微服務(wù)架構(gòu)中的“通訊錄”,它記錄了服務(wù)和服務(wù)地址的映射關(guān)系。在分布式架構(gòu)中,服務(wù)會(huì)注冊(cè)到這里,當(dāng)服務(wù)需要調(diào)用其它服務(wù)時(shí),就到這里找到服務(wù)的地址,進(jìn)行調(diào)用。
使用Eureka
概念:
? Eureka 是 Netflix 公司開(kāi)源的一個(gè)服務(wù)注冊(cè)與發(fā)現(xiàn)的組件 。
? Eureka 和其他 Netflix 公司的服務(wù)組件(例如負(fù)載均衡、熔斷器、網(wǎng)關(guān)等) 一起,被 Spring Cloud 社區(qū)整合為Spring-Cloud-Netflix 模塊。
? Eureka 包含兩個(gè)組件:Eureka Server (注冊(cè)中心) 和 Eureka Client (服務(wù)提供者、服務(wù)消費(fèi)者)。
操作:
架構(gòu)圖一覽創(chuàng)建Serve端 新建項(xiàng)目application.yaml
server:
port: 8080
# Eureka配置
eureka:
instance:
## Eureka實(shí)例的名稱
hostname: localhostA
client:
# false表示自己端就是注冊(cè)中心,職責(zé)就是維護(hù)服務(wù)實(shí)例,并不需要去檢查服務(wù)
fetch-registry: false
# false表示不向注冊(cè)中心注冊(cè)自己
register-with-eureka: false
# 設(shè)置與Eureka Server交互的地址查詢服務(wù)和注冊(cè)服務(wù)都需要依賴這個(gè)地址
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
啟動(dòng)類配置// 表示當(dāng)前類為服務(wù)端Eureka服務(wù)端
@EnableEurekaServer
@SpringBootApplication
public class CloudA1Application {public static void main(String[] args) {SpringApplication.run(CloudA1Application.class, args);
}
}
啟動(dòng)測(cè)試一下訪問(wèn)自己的
localhost:端口號(hào)
一切正常再繼續(xù)
創(chuàng)建Client端的服務(wù)提供端 新建項(xiàng)目新增依賴Eureka Client包括兩個(gè)服務(wù)模塊:Service Provider(服務(wù)提供方)和Service Consumer(服務(wù)消費(fèi)方)。
org.projectlombok lombok true com.alibaba druid 1.1.16 com.baomidou mybatis-plus-boot-starter 3.4.2 mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-web
配置文件application.yaml
server:
port: 8081
# Eureka配置
eureka:
client:
# 表示將自己注冊(cè)進(jìn)Eureka Server默認(rèn)為true
register-with-eureka: true
# 是否從Eureka Server抓去已有的注冊(cè)信息,默認(rèn)是true
fetch-registry: true
# 設(shè)置與Eureka Server交互的地址查詢服務(wù)和注冊(cè)服務(wù)都需要依賴這個(gè)地址
service-url:
defaultZone: http://localhost:8080/eureka
#數(shù)據(jù)庫(kù)配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/blog?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
username: root
password: xxx
type: com.alibaba.druid.pool.DruidDataSource
# 當(dāng)前服務(wù)注冊(cè)在Eureka Server的名稱
application:
name: server-provider1
#MP配置
mybatis-plus:
# 配置外部xml映射
configuration:
# 開(kāi)啟SQL日志輸出
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 開(kāi)啟駝峰映射
map-underscore-to-camel-case: true
mapper-locations: classpath:mapper/*.xml
啟動(dòng)類配置// 表示當(dāng)前類客戶端Eureka
@EnableDiscoveryClient
@SpringBootApplication
public class CloudB1Application {public static void main(String[] args) {SpringApplication.run(CloudB1Application.class, args);
}
}
編寫控制器類package com.learn.cloudb1.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/hello")
public class HelloController {@GetMapping("/get1")
public String hello(){return "hello world!";
}
}
啟動(dòng)測(cè)試訪問(wèn)自己的 localhost:端口號(hào)(就是服務(wù)注冊(cè)中心)
可以發(fā)現(xiàn)多了些東西,一個(gè)報(bào)錯(cuò)和剛剛注冊(cè)好的服務(wù)提供者
創(chuàng)建方法和創(chuàng)建Client端的服務(wù)服務(wù)端一樣
配置文件server:
port: 8083
spring:
application:
name: service-customer1
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka
啟動(dòng)類@EnableDiscoveryClient
@SpringBootApplication
public class CloudB1Customer1Application {public static void main(String[] args) {SpringApplication.run(CloudB1Customer1Application.class, args);
}
}
控制器package com.learn.cloudb1_customer1.controller;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/getMes")
public class GetMesController {//從Euraka Server中獲取服務(wù)提供方的服務(wù)地址信息
@Autowired
private DiscoveryClient ds;
@GetMapping()
public String getMes(){//服務(wù)提供者的名字
//服務(wù)發(fā)現(xiàn)
ListinstanceList = ds.getInstances("server-provider1");
int port=0;
String host="";
//打印服務(wù)機(jī)器的信息
for (ServiceInstance instance : instanceList) {//服務(wù)主機(jī)端口號(hào)
port = instance.getPort();
System.out.println("服務(wù)主機(jī)端口號(hào):"+ port);
//服務(wù)主機(jī)名字
host = instance.getHost();
System.out.println("服務(wù)主機(jī)名字:"+host);
}
return host+"++++"+port;
}
}
啟動(dòng)測(cè)試發(fā)現(xiàn)又多了一個(gè)
點(diǎn)擊這里再輸入自己定義的接口發(fā)現(xiàn)也可正常訪問(wèn)
準(zhǔn)備兩個(gè)Eureka Server
分別進(jìn)行配置,相互注冊(cè)
Eureka Client 分別注冊(cè)到這兩個(gè) Eureka Server中
創(chuàng)建eureka-server1
server:
port: 8761
eureka:
instance:
hostname: eureka-server1 # 主機(jī)名
client:
service-url:
defaultZone: http://eureka-server2:8762/eureka
register-with-eureka: true # 是否將自己的路徑 注冊(cè)到eureka上。eureka server 不需要的,eureka provider client 需要
fetch-registry: true # 是否需要從eureka中抓取路徑。eureka server 不需要的,eureka consumer client 需要
spring:
application:
name: eureka-server-ha
創(chuàng)建eureka-server2
server:
port: 8762
eureka:
instance:
hostname: eureka-server2 # 主機(jī)名
client:
service-url:
defaultZone: http://eureka-server1:8761/eureka
register-with-eureka: true # 是否將自己的路徑 注冊(cè)到eureka上。eureka server 不需要的,eureka provider client 需要
fetch-registry: true # 是否需要從eureka中抓取路徑。eureka server 不需要的,eureka consumer client 需要
spring:
application:
name: eureka-server-ha
修改provider
server:
port: 8001
eureka:
instance:
hostname: localhost # 主機(jī)名
prefer-ip-address: true # 將當(dāng)前實(shí)例的ip注冊(cè)到eureka server 中。默認(rèn)是false 注冊(cè)主機(jī)名
ip-address: 127.0.0.1 # 設(shè)置當(dāng)前實(shí)例的ip
instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port} # 設(shè)置web控制臺(tái)顯示的 實(shí)例id
lease-renewal-interval-in-seconds: 3 # 每隔3 秒發(fā)一次心跳包
lease-expiration-duration-in-seconds: 9 # 如果9秒沒(méi)有發(fā)心跳包,服務(wù)器呀,你把我干掉吧~
client:
service-url:
defaultZone: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka # eureka服務(wù)端地址,將來(lái)客戶端使用該地址和eureka進(jìn)行通信
spring:
application:
name: eureka-provider # 設(shè)置當(dāng)前應(yīng)用的名稱。將來(lái)會(huì)在eureka中Application顯示。將來(lái)需要使用該名稱來(lái)獲取路徑
修改consumer
server:
port: 9000
eureka:
instance:
hostname: localhost # 主機(jī)名
client:
service-url:
defaultZone: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka # eureka服務(wù)端地址,將來(lái)客戶端使用該地址和eureka進(jìn)行通信
spring:
application:
name: eureka-consumer # 設(shè)置當(dāng)前應(yīng)用的名稱。將來(lái)會(huì)在eureka中Application顯示。將來(lái)需要使用該名稱來(lái)獲取路徑
高可用測(cè)試:停掉一個(gè)eureka,依然可以訪問(wèn)consumer。
Eureka配置詳情實(shí)例信息配置
eureka:
instance:
hostname: localhost # 主機(jī)名
prefer-ip-address: # 是否將自己的ip注冊(cè)到eureka中,默認(rèn)false 注冊(cè) 主機(jī)名
ip-address: # 設(shè)置當(dāng)前實(shí)例ip
instance-id: # 修改instance-id顯示
lease-renewal-interval-in-seconds: 30 # 每一次eureka client 向 eureka server發(fā)送心跳的時(shí)間間隔
lease-expiration-duration-in-seconds: 90 # 如果90秒內(nèi)eureka server沒(méi)有收到eureka client的心跳包,則剔除該服務(wù)
客戶端特性配置
eureka:
client:
service-url:
# eureka服務(wù)端地址,將來(lái)客戶端使用該地址和eureka進(jìn)行通信
defaultZone:
register-with-eureka: # 是否將自己的路徑 注冊(cè)到eureka上。
fetch-registry: # 是否需要從eureka中抓取數(shù)據(jù)。
注冊(cè)中心端配置
eureka:
server: #是否開(kāi)啟自我保護(hù)機(jī)制,默認(rèn)true
enable-self-preservation:
eviction-interval-timer-in-ms: 120 2月#清理間隔(單位毫秒,默認(rèn)是60*1000)
instance:
lease-renewal-interval-in-seconds: 30 # 每一次eureka client 向 eureka server發(fā)送心跳的時(shí)間間隔
lease-expiration-duration-in-seconds: 90 # 如果90秒內(nèi)eureka server沒(méi)有收到eureka clien
儀表盤配置
eureka:
dashboard:
enabled: true # 是否啟用eureka web控制臺(tái)
path: / # 設(shè)置eureka web控制臺(tái)默認(rèn)訪問(wèn)路徑
OK!入門結(jié)束
當(dāng)然常用的做法是將多個(gè)模塊/項(xiàng)目建立在一個(gè)maven父工程中,這樣更容易管理與使用
其他更詳細(xì)的適合入門的文章
https://www.cnblogs.com/h–d/p/12635204.html
https://blog.csdn.net/jc_hook/article/details/122413858
報(bào)錯(cuò)解決方法
https://blog.csdn.net/hadues/article/details/105023709
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧