springCloud - Eureka
阿新 • • 發佈:2020-07-13
1.SpringCloud簡介
SpringCloud集成了很多元件,包括:
- Eureka: 服務治理,服務註冊/發現
- Zuul: 閘道器元件,提供智慧路由,訪問過濾功能 (集成了ribbon、hystrix)
- Ribbon:客戶端負載均衡的服務呼叫元件(客戶端負載)
- Fegin: 服務之間的呼叫元件 (集成了ribbon、hystrix)
- Hystrix: 容錯管理元件
2.Eureka註冊中心
- Eureka:就是服務註冊中心(可以是一個叢集),對外暴露自己的地址
- 提供者:啟動後向Eureka註冊自己資訊(地址,提供什麼服務)
- 消費者:向Eureka訂閱服務,Eureka會將對應服務的所有提供者地址列表傳送給消費者,並且定期更新
- 心跳(續約):提供者定期通過http方式向Eureka重新整理自己的狀態
2.1.搭建註冊中心EurekaServer
匯入依賴:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RC2</spring-cloud.version> </properties> <!--註冊中心的依賴--> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <!-- SpringCloud的依賴 統一管理版本號--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
編寫application.yml配置檔案
server:
port: 8081 # 埠
spring:
application:
name: eureka-server # 應用名稱,會在Eureka中顯示
eureka:
client:
service-url: # EurekaServer的地址,現在是自己的地址,如果是叢集,需要加上其它Server的地址。
defaultZone: http://127.0.0.1:${server.port}/eureka
在引導類上加註解:
@SpringBootApplication @EnableEurekaServer // 聲明當前springboot應用是一個eureka服務中心 public class ItcastEurekaApplication { public static void main(String[] args) { SpringApplication.run(ItcastEurekaApplication.class, args); } }
直接啟動,訪問http:localhost:8081即可訪問到
2.2.將其他服務註冊到Eureka中
service-provide
- 在pom.xml中,新增springcloud的相關依賴。
- 在application.yml中,新增springcloud的相關配置。
- 在引導類上添加註解,把服務注入到eureka註冊中心。
參照service-eureka的pom.xml中加入Eureka的客戶端,載匯入其他與資料庫相關的依賴等
<!-- Eureka客戶端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml:
erver:
port: 8082
spring:
datasource:
url: jdbc:mysql://localhost:3306/li
username: root
password: root
driverClassName: com.mysql.jdbc.Driver
application:
name: service-provider # 應用名稱,註冊到eureka後的服務名稱
mybatis:
type-aliases-package: com.li.service.pojo
eureka:
client:
service-url: # EurekaServer地址
defaultZone: http://127.0.0.1:8081/eureka
在引導類上加上註解
@SpringBootApplication
@EnableDiscoveryClient
public class ItcastServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ItcastServiceApplication.class, args);
}
}
啟動後在註冊中心中就可以看到此服務,可以再寫一個服務的消費方的服務,也註冊到Eureka中,通過feign來遠端呼叫;
service-customer
1.加入Feign依賴
<!--引入Feign元件依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.引導類加上註解
@SpringBootApplication
@EnableDiscoveryClient //啟動客戶端
@EnableFeignClients //啟用Feign元件代替RestTemplate遠端呼叫 :其中包含熔斷和負載均衡
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class,args);
}
}
3.建立介面
/**
* fallback = UserClientFallback.class : 熔斷
*/
@FeignClient(value = "service-provide") //宣告介面為feign客戶端介面,並指明呼叫的微服務名(id)
public interface UserClient {
@GetMapping("user/{id}")
public User queryUserById(@PathVariable("id") Integer id);
}
4.建立controller
@Controller
@RequestMapping("consumer/user")
public class UserController {
@Autowired
private UserClient userClient;
@GetMapping
@ResponseBody
public String queryUserById(@RequestParam("id") Integer id) {
return this.userClient.queryUserById(id).toString();
}
}
3.服務提供方
服務續約
在註冊服務完成以後,服務提供者會維持一個心跳(定時向EurekaServer發起Rest請求),告訴EurekaServer:“我還活著”。這個我們稱為服務的續約(renew);
eureka:
instance:
lease-expiration-duration-in-seconds: 10 # 10秒即過期
lease-renewal-interval-in-seconds: 5 # 5秒一次心跳
- lease-expiration-duration-in-seconds: 服務續約(renew)的間隔,預設為30秒
- lease-expiration-duration-in-seconds:服務失效時間,預設值90秒
預設情況下每個30秒服務會向註冊中心傳送一次心跳,證明自己還活著。如果超過90秒沒有傳送心跳,則會在服務列表裡移除
4.服務消費方
eureka:
client:
service-url:
registry-fetch-interval-seconds: 5 #拉取服務的間隔時間
5.失效剔除和自我保護
失效剔除
有時服務掛掉過著關掉,Eureka Server會將這些服務從列表中剔除:
自我保護
在當某些服務掛掉之後,Eureka會將這寫服務保護一段時間,不被直接剔除
eureka:
server:
enable-self-preservation: false # 關閉自我保護模式(預設為開啟)
eviction-interval-timer-in-ms: 1000 # 掃描失效服務的間隔時間(預設為60*1000ms)