SpringCloud(三):SpringBoot集成Eureka的項目配置

SpringBoot集成Eureka

首先第一點,查看Eureka官方,看下springBoot與Eureeka版本問題。防止版本不兼容問題

在這裏插入圖片描述

  • Finchley 兼容Spring Boot 2.0.x,不兼容Spring Boot 1.5.x
  • Dalston和Edgware 兼容Spring Boot 1.5.x,不兼容Spring Boot 2.0.x
  • Camden 兼容Spring Boot 1.4.x,也兼容Spring Boot 1.5.x
  • Brixton 兼容Spring Boot 1.3.x,也兼容Spring Boot 1.4.x
  • Angel 兼容Spring Boot 1.2.x

道人最開始選擇的版本爲SpringBoot 2.3.1版本,springCloud 選 Hoxton.SR5版本,但是該版本選擇,在道人本地創建父項目進行版本管理時,子項目依賴導入失敗,故最後降低版本,解決了該問題。問題的原因暫時沒找到,歡迎道友指點!

具體代碼參見道人的開源項目:https://github.com/bigskyfish/springCloudLearn

項目大致結構

在這裏插入圖片描述

一:父項目

目的:使用標籤進行版本管理,避免版本衝突。

父項目-cloudlearn
  • 父項目的打包形式必須是pom:pom
  • :標籤進行模塊管理
  • :標籤進行版本管理,避免版本衝突
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.floatcloud</groupId>
	<artifactId>cloudlearn</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>cloudlearn</name>
	<packaging>pom</packaging>
	<description>Demo project for Spring Boot</description>

	<modules>
		<module>eureka-server8001</module>
		<module>order-server9001</module>
		<module>order-server9002</module>
		<module>consumer-client7001</module>
	</modules>

	<properties>
		<java.version>1.8</java.version>
		<spring-boot.version>2.1.5.RELEASE</spring-boot.version>
		<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
	</properties>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring-boot.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>

		</dependencies>
	</dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

</project>

二:Eureka服務註冊

pom.xml
  • 打包形式爲jar:jar
  • 中依賴不指定版本會直接應用父項目中的jar包版本
  • 導入的是spring-cloud-starter-netflix-eureka-server的jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.floatcloud</groupId>
		<artifactId>cloudlearn</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<groupId>com.floatcloud</groupId>
	<artifactId>eureka-server8001</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>eureka-server8001</name>
	<packaging>jar</packaging>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>


	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>
pom.xml
server:
  port: 8001
eureka:
  instance:
    # 服務註冊中心IP地址
    hostname: localhost
  client:
    # 是否向服務註冊中心註冊自己
    register-with-eureka: false
    # 是否檢索服務
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
springboot入口(啓動類)
  • 需加上@EnableEurekaServer註解
package com.floatcloud.eurekaserver8001;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServer8001Application {

	public static void main(String[] args) {
		SpringApplication.run(EurekaServer8001Application.class, args);
	}

}

三:服務提供者(Provider)

這裏展示的order-server9001模塊代碼,order-server9002與order-server9001模塊代碼相同。

pom.xml
  • 打包形式爲jar:jar
  • 中依賴不指定版本會直接應用父項目中的jar包版本
  • 導入的是spring-cloud-starter-netflix-eureka-client的jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloudlearn</artifactId>
        <groupId>com.floatcloud</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>


    <groupId>com.floatcloud</groupId>
    <artifactId>order-server9001</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>order-server9001</name>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
application.yml
  • 多個服務組成的集羣的項目名稱需要保持一致。
#啓動端口
server:
  port: 9001
#項目名稱
spring:
  application:
    name: order-provider
#eureka配置
eureka:
  instance:
    prefer-ip-address: true #使用服務的id地址註冊
    hostname: localhost
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/
    fetch-registry: true
    register-with-eureka: true
springboot入口(啓動類)
  • 需加上@EnableEurekaServer註解
package com.floatcloud.orderclient9001;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * OrderClient9001Application
 *
 * @auther FloatCloud
 * @date 2020/6/23
 */
@SpringBootApplication
@EnableEurekaClient
public class OrderClient9001Application {

    public static void main(String[] args){
        SpringApplication.run(OrderClient9001Application.class, args);
    }
}
調用接口(Controller)
  • @RestController : 返回數據爲對象而非頁面,相當於@ResponseBody + @Controller
  • 這裏標記了下端口號,負載均衡時,更加直觀。
package com.floatcloud.orderclient9001.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * OrderController
 *
 * @auther FloatCloud
 * @date 2020/6/23
 */
@RestController
public class OrderController {

    @Value("${server.port}")
    private String port;

    @GetMapping("/order-server/create/order")
    public String createOrder(){
        return "端口:"+port+"產生訂單";
    }
}

四:服務消費者(Consumer)

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloudlearn</artifactId>
        <groupId>com.floatcloud</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>


    <groupId>com.floatcloud</groupId>
    <artifactId>consumer-client7001</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>consumer-client7001</name>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
</project>
application.yml
#啓動端口
server:
  port: 7001
#項目名稱
spring:
  application:
    name: order-consumer
#eureka配置
eureka:
  instance:
    prefer-ip-address: true #使用服務的id地址註冊
    hostname: localhost
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/
springboot入口(啓動類)
  • 需加上@EnableEurekaServer註解
配置類
  • RestTemplate納入javaBean管理
package com.floatcloud.consumerclient.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;

/**
 * SysConfiguration
 * 遠程調用採用的是RestTemplate方式調用
 * @LoadBalanced 該註解做負載均衡,詳細會在道人博客中介紹
 * @auther FloatCloud
 * @date 2020/6/23
 */
@Configuration
public class SysConfiguration {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return  new RestTemplate();
    }
}

遠程調用(基於RestTemplate)
  • 調用的url爲服務提供者在Eureka服務註冊中心,註冊的application值。
package com.floatcloud.consumerclient.controller;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * ConsumerController
 *
 * @auther FloatCloud
 * @date 2020/6/23
 */
@RestController
public class ConsumerController {

    @Resource
    private RestTemplate restTemplate;

    /**
     * 服務提供的地址:即服務提供方的spring.application.name 轉大寫
     * 也可以理解爲在Eureka服務註冊中心,註冊的application值。
     */
    final String urlPath = "http://ORDER-PROVIDER";

    @GetMapping("/consumer/make/order")
    public String makeOrder(@RequestParam("name") String name){
        String template = restTemplate.getForObject(urlPath + "/order-server/create/order", String.class);
        return name + template;
    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章