SpringCloud 03 - Eureka 服務注冊與發現
1. 注冊中心Zookeeper
- Zookeeper 是一個分布式協調工具,可以實作注冊中心功能
- 關閉 Linux 伺服器防火牆後啟動 Zookeeper 伺服器
- Zookeeper 伺服器取代 Eureka 伺服器,zk 作為服務注冊中心
關閉防火牆:
檢視 linux 系統 ip:
保證兩邊系統網絡互通:
2. 服務提供者
① 建立 cloud-provider-payment8004 module
② POM (主要是加了 Zookeeper 的依賴,其他和 8001 一樣)
<dependencies>
<!--SpringBoot整合Zookeeper用戶端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<!--web啟動器 和下面的監控幾乎同時出現-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--監控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--熱部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<optional>true</optional>
</dependency>
<!--SpringBoot測試-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
③ YML
server:
# 8004表示注冊到zookeeper伺服器的支付服務提供者端口号
port: 8004
spring:
application:
# 服務别名---注冊zookeeper到注冊中心的名稱
name: cloud-provider-payment
cloud:
zookeeper:
# 預設localhost:2181
connect-string: 192.168.181.130:2181
④主啟動類:@EnableDiscoveryClient
package com.janet.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author Janet
* @date 2020/5/3
*/
@SpringBootApplication
@EnableDiscoveryClient //該注解用于向使用 consul 或者 zookeeper 作為注冊中心時注冊服務
public class PaymentMain8004 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8004.class, args);
}
}
⑤Controller
package com.janet.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
/**
* @author Janet
* @date 2020/5/3
*/
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@RequestMapping("/payment/zk")
public String paymentZk(){
return "springcloud with zookeeper : "+serverPort+"\t"+ UUID.randomUUID().toString();
}
}
⑥ 啟動8004注冊進zookeeper
啟動zk:zkServer.sh start
啟動後問題
如果自己安裝的 zookeeper 版本 和它自帶的版本不一樣,可能會有 jar 包沖突問題:
解決:<dependencies> <!--SpringBoot整合Zookeeper用戶端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> <exclusions> <!--先排除自帶的zookeeper3.5.3--> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions> </dependency> <!--添加zookeeper3.4.9版本--> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.9</version> </dependency> <!--web啟動器 和下面的監控幾乎同時出現--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--監控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--熱部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <optional>true</optional> </dependency> <!--SpringBoot測試--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
⑦ 驗證測試
http://localhost:8004/payment/zk
獲得json串後用線上工具檢視:
思考:服務節點是臨時節點還是持久節點?
臨時節點,服務關閉後,不會立刻清除,過一段時間之後如果心跳收不到回應,就直接删除。
3. 服務消費者
① 建立 cloud-consumerzk-order80 module
② POM
<dependencies>
<!--SpringBoot整合Zookeeper用戶端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<exclusions>
<!--先排除自帶的zookeeper3.5.3-->
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加zookeeper3.4.9版本-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
<!--本項目的 common 子產品-->
<dependency>
<groupId>com.janet.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!--web啟動器 和下面的監控幾乎同時出現-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--監控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--熱部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<optional>true</optional>
</dependency>
<!--SpringBoot測試-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
③ YML
server:
# 80表示注冊到zookeeper伺服器的支付服務提供者端口号
port: 80
spring:
application:
# 服務别名---注冊zookeeper到注冊中心的名稱
name: cloud-consumer-order
cloud:
# 注冊到 zookeepe 位址
zookeeper:
connect-string: 192.168.181.130:2181
④ 主啟動
package com.janet.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author Janet
* @date 2020/5/4
*/
@SpringBootApplication
@EnableDiscoveryClient
public class OrderZKMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderZKMain80.class, args);
}
}
⑤ 配置 bean
package com.janet.springcloud.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @author Janet
* @date 2020/5/4
*/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
⑥ controller
package com.janet.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* @author Janet
* @date 2020/5/4
*/
@RestController
@Slf4j
public class OrderZKController {
public static final String INVOKE_URL = "http://cloud-provider-payment";
@Autowired
private RestTemplate restTemplate;
/**
* http://localhost/consumer/payment/zk
*/
@GetMapping("/consumer/payment/zk")
public String paymentInfo() {
return restTemplate.getForObject(INVOKE_URL + "/payment/zk", String.class);
}
}
⑦ 驗證測試
通路測試位址:
SpringCloud 05 - Consul 服務注冊與發現