1. 程式人生 > 實用技巧 >SpringCloud 專案搭建 --Eureka

SpringCloud 專案搭建 --Eureka

SpringCloud 專案搭建 -Eureka

一、Eureka簡介

  Eureka是Netflix開發的服務發現框架,本身是一個基於REST的服務,主要用於定位執行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud將它整合在其子專案spring-cloud-netflix中,以實現SpringCloud的服務發現功能。

  1、Eureka元件

  Eureka包含兩個元件:Eureka Server和Eureka Client。

  1.1 Eureka Server

  Eureka Server提供服務註冊服務,各個節點啟動後,會在Eureka Server中進行註冊,這樣Eureka Server中的服務登錄檔中將會儲存所有可用服務節點的資訊,服務節點的資訊可以在介面中直觀的看到。
  Eureka Server本身也是一個服務,預設情況下會自動註冊到Eureka註冊中心。
  如果搭建單機版的Eureka Server註冊中心,則需要配置取消Eureka Server的自動註冊邏輯。

畢竟當前服務註冊到當前服務代表的註冊中心中是一個說不通的邏輯。
  Eureka Server通過Register、Get、Renew等介面提供服務的註冊、發現和心跳檢測等服務。

  2.1 Eureka Client

  Eureka Client是一個java客戶端,用於簡化與Eureka Server的互動,客戶端同時也具備一個內建的、使用輪詢(round-robin)負載演算法的負載均衡器。在應用啟動後,將會向Eureka Server傳送心跳,預設週期為30秒,如果Eureka Server在多個心跳週期內沒有接收到某個節點的心跳,Eureka Server將會從服務登錄檔中把這個服務節點移除(預設90秒)


  Eureka Client分為兩個角色,分別是:Application Service(Service Provider)和Application Client(Service Consumer)

  2.1.1 Application Service

  服務提供方,是註冊到Eureka Server中的服務。

  2.1.2 Application Client

  服務消費方,通過Eureka Server發現服務,並消費。

  在這裡,Application Service和Application Client不是絕對上的定義,因為Provider在提供服務的同時,也可以消費其他Provider提供的服務;Consumer在消費服務的同時,也可以提供對外服務。

  2、Eureka Server架構原理簡介

Register(服務註冊):把自己的IP和埠註冊給Eureka。
Renew(服務續約):傳送心跳包,每30秒傳送一次。告訴Eureka自己還活著。
Cancel(服務下線):當provider關閉時會向Eureka傳送訊息,把自己從服務列表中刪除。防止consumer呼叫到不存在的服務。
Get Registry(獲取服務註冊列表):獲取其他服務列表。
Replicate(叢集中資料同步):eureka叢集中的資料複製與同步。
Make Remote Call(遠端呼叫):完成服務的遠端呼叫。

  Eureka Server
  Eureka Server既是一個註冊中心,同時也是一個服務。那麼搭建Eureka Server的方式和以往搭建Dubbo註冊中心ZooKeeper的方式必然不同,那麼首先搭建一個單機版的Eureka Server註冊中心。

SpringCloud-Eureka 專案整合搭建

建立dept資料庫 sql 檔案

 1 /*
 2  Navicat Premium Data Transfer
 3 
 4  Source Server         : localhost_3306
 5  Source Server Type    : MySQL
 6  Source Server Version : 50527
 7  Source Host           : localhost:3306
 8  Source Schema         : db01
 9 
10  Target Server Type    : MySQL
11  Target Server Version : 50527
12  File Encoding         : 65001
13 
14  Date: 04/11/2020 23:03:17
15 */
16 
17 SET NAMES utf8mb4;
18 SET FOREIGN_KEY_CHECKS = 0;
19 
20 -- ----------------------------
21 -- Table structure for dept
22 -- ----------------------------
23 DROP TABLE IF EXISTS `dept`;
24 CREATE TABLE `dept`  (
25   `deptno` int(11) NOT NULL AUTO_INCREMENT,
26   `dname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
27   `db_source` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
28   PRIMARY KEY (`deptno`) USING BTREE
29 ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
30 
31 -- ----------------------------
32 -- Records of dept
33 -- ----------------------------
34 INSERT INTO `dept` VALUES (1, '開發部', 'db01');
35 INSERT INTO `dept` VALUES (2, '人事部', 'db01');
36 INSERT INTO `dept` VALUES (3, '財務部', 'db01');
37 INSERT INTO `dept` VALUES (4, '市場部', 'db01');
38 INSERT INTO `dept` VALUES (5, '運維部', 'db01');
39 INSERT INTO `dept` VALUES (6, '遊戲部', 'db01');
40 INSERT INTO `dept` VALUES (7, NULL, 'db01');
41 
42 SET FOREIGN_KEY_CHECKS = 1;

1.建立maven專案

Springcloud Maven 總專案統一管理maven依賴以及依賴版本

新增springcloud所需要的pom依賴

pom檔案裡的 <modules>標籤可以先註釋起來。搭建到哪裡再開啟

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <project xmlns="http://maven.apache.org/POM/4.0.0"
  3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5     <modelVersion>4.0.0</modelVersion>
  6 
  7     <groupId>com.puyu</groupId>
  8     <artifactId>springcloud</artifactId>
  9     <version>1.0-SNAPSHOT</version>
 10     <modules>
 11         <module>springcloud-api</module>
 12         <module>springcloud-provider-dept-8001</module>
 13         <module>springcloud-provider-dept-8002</module>
 14         <module>springcloud-provider-dept-8003</module>
 15         <module>springcloud-consumer-dept-81</module>
 16         <module>springcloud-eureka-7001</module>
 17         <module>springcloud-eureka-7002</module>
 18         <module>springcloud-eureka-7003</module>
 19         <module>springcloud-consumer-dept-feign</module>
 20         <module>springcloud-provider-dept-hystrix-8001</module>
 21         <module>springcloud-consumer-hystrix-dashboard</module>
 22         <module>springcloud-zuul</module>
 23         
 24     </modules>
 25 
 26     <!-- 打包方式 pom-->
 27     <packaging>pom</packaging>
 28     <properties>
 29         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 30         <maven.compiler.source>1.8</maven.compiler.source>
 31         <maven.compiler.target>1.8</maven.compiler.target>
 32         <junit.version>4.12</junit.version>
 33         <lombok.version>1.18.12</lombok.version>
 34         <log4j.version>1.2.17</log4j.version>
 35     </properties>
 36 
 37     <dependencyManagement>
 38         <dependencies>
 39             <!--  springcloud 依賴    -->
 40             <dependency>
 41                 <groupId>org.springframework.cloud</groupId>
 42                 <artifactId>spring-cloud-dependencies</artifactId>
 43                 <version>Greenwich.SR1</version>
 44                 <type>pom</type>
 45                 <scope>import</scope>
 46             </dependency>
 47             <!--  springboot 依賴     -->
 48             <dependency>
 49                 <groupId>org.springframework.boot</groupId>
 50                 <artifactId>spring-boot-dependencies</artifactId>
 51                 <version>2.1.4.RELEASE</version>
 52                 <type>pom</type>
 53                 <scope>import</scope>
 54             </dependency>
 55             <!--  資料庫依賴      -->
 56             <dependency>
 57                 <groupId>mysql</groupId>
 58                 <artifactId>mysql-connector-java</artifactId>
 59                 <version>5.1.47</version>
 60             </dependency>
 61             <dependency>
 62                 <groupId>com.alibaba</groupId>
 63                 <artifactId>druid</artifactId>
 64                 <version>1.1.10</version>
 65             </dependency>
 66             <!--  springboot 啟動器 依賴      -->
 67             <dependency>
 68                 <groupId>org.mybatis.spring.boot</groupId>
 69                 <artifactId>mybatis-spring-boot-starter</artifactId>
 70                 <version>1.3.2</version>
 71             </dependency>
 72             <!--  主要用於日誌和測試 -->
 73             <!--    junit      -->
 74             <dependency>
 75                 <groupId>junit</groupId>
 76                 <artifactId>junit</artifactId>
 77                 <version>${junit.version}</version>
 78             </dependency>
 79             <!--     lombok       -->
 80             <dependency>
 81                 <groupId>org.projectlombok</groupId>
 82                 <artifactId>lombok</artifactId>
 83                 <version>${lombok.version}</version>
 84             </dependency>
 85             <!--    log4j      -->
 86             <dependency>
 87                 <groupId>log4j</groupId>
 88                 <artifactId>log4j</artifactId>
 89                 <version>${log4j.version}</version>
 90             </dependency>
 91             <dependency>
 92                 <groupId>ch.qos.logback</groupId>
 93                 <artifactId>logback-core</artifactId>
 94                 <version>1.2.3</version>
 95             </dependency>
 96             <!--      test      -->
 97             <dependency>
 98                 <groupId>org.springframework.boot</groupId>
 99                 <artifactId>spring-boot-test</artifactId>
100             </dependency>
101             <dependency>
102                 <groupId>org.springframework.boot</groupId>
103                 <artifactId>spring-boot-wen</artifactId>
104             </dependency>
105             <!--    jetty        -->
106             <dependency>
107                 <groupId>org.springframework.boot</groupId>
108                 <artifactId>spring-boot-jetty</artifactId>
109             </dependency>
110             <!--     熱部署       -->
111             <dependency>
112                 <groupId>org.springframework.boot</groupId>
113                 <artifactId>spring-boot-devtools</artifactId>
114             </dependency>
115         </dependencies>
116     </dependencyManagement>
117 
118 
119 </project>

2.新建子專案springcloud-api

實體類存放的專案,此專案先只建立一個Dept專案

新增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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>com.puyu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-api</artifactId>
<!--當前的module自己需要的依賴,如果父依賴中已經配置了版本,這裡的不用寫版本號-->
    <dependencies>
        <!-- lombok依賴-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <!--  Feign依賴  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

    </dependencies>

</project>

建立Dept 實體類

 1 package com.puyu.springcloud.pojo;
 2 
 3 import lombok.Data;
 4 import lombok.NoArgsConstructor;
 5 import lombok.experimental.Accessors;
 6 
 7 import java.io.Serializable;
 8 
 9 @Data//lombok
10 @NoArgsConstructor
11 @Accessors(chain = true) //鏈式寫法
12 public class Dept implements Serializable {
13     private Long deptno;
14     private String dname;
15     private String db_source;
16 
17     public Dept(String dname) {
18         this.dname = dname;
19     }
20 }

3.新建子專案springcloud-consumer-dept-81

springcloud-consumer-dept-81 -------------為消費者

新增pom依賴

(1).pom裡匯入springcloud-api 依賴 拿到Dept類的例項

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <parent>
 6         <artifactId>springcloud</artifactId>
 7         <groupId>com.puyu</groupId>
 8         <version>1.0-SNAPSHOT</version>
 9     </parent>
10     <modelVersion>4.0.0</modelVersion>
11 
12     <artifactId>spingcloud-consumer-dept-81</artifactId>
13 
14     <!--  實體類+web依賴   -->
15     <dependencies>
16         <!--   新增ribbon需要的依賴 完成負載均衡    -->
17         <dependency>
18             <groupId>org.springframework.cloud</groupId>
19             <artifactId>spring-cloud-starter-ribbon</artifactId>
20             <version>1.4.6.RELEASE</version>
21         </dependency>
22         <!--  因為要從服務中心 判斷拿那些東西 所以需要eureka依賴  client 客戶端依賴    -->
23         <dependency>
24             <groupId>org.springframework.cloud</groupId>
25             <artifactId>spring-cloud-starter-eureka</artifactId>
26             <version>1.4.6.RELEASE</version>
27         </dependency>
28         <!-- 匯入springcloud-api 以便獲取到Dept例項-->
29         <dependency>
30             <groupId>com.puyu</groupId>
31             <artifactId>springcloud-api</artifactId>
32             <version>1.0-SNAPSHOT</version>
33         </dependency>
34         <dependency>
35             <groupId>org.springframework.boot</groupId>
36             <artifactId>spring-boot-starter-web</artifactId>
37         </dependency>
38         <!--   熱部署依賴     -->
39         <!--  <dependency>
40               <groupId>org.springframework.boot</groupId>
41               <artifactId>spring-boot-devtools</artifactId>
42           </dependency>-->
43     </dependencies>
44 </project>

建立application.yml 配置檔案

 1 server:
 2   port: 81  #訪問埠號
 3 
 4 #客戶端消費端 eureka配置
 5 eureka:
 6   client:
 7     register-with-eureka: false #先宣告不向eureka中註冊自己
 8     serviceUrl:
 9       defaultZone: http://localhost:7001/eureka
10   #    defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
11       #客戶端 隨機向defaultzone中隨機選擇一個去訪問 實現負載均衡

建立ConfigBean  

什麼是RestTemplate

RestTemplate 是從 Spring3.0 開始支援的一個 HTTP 請求工具,它提供了常見的REST請求方案的模版,例如 GET 請求、POST 請求、PUT 請求、DELETE 請求以及一些通用的請求執行方法 exchange 以及 execute。RestTemplate 繼承自 InterceptingHttpAccessor 並且實現了 RestOperations 介面,其中 RestOperations 介面定義了基本的 RESTful 操作,這些操作在 RestTemplate 中都得到了實現。接下來我們就來看看這些操作方法的使用

 1 package com.puyu.springcloud.config;
 2 
 3 import com.netflix.loadbalancer.IRule;
 4 import com.netflix.loadbalancer.RandomRule;
 5 import org.springframework.cloud.client.loadbalancer.LoadBalanced;
 6 import org.springframework.context.annotation.Bean;
 7 import org.springframework.context.annotation.Configuration;
 8 import org.springframework.web.client.RestTemplate;
 9 
10 @Configuration
11 public class ConfigBean {
12 
13     //配置賦值均衡實現RestTemlate
14     //IRule
15     //RoundRobinRule 輪詢
16     //RandomRule 隨機
17     //AvailbiliryFilteringRule  :會過濾掉 跳閘,訪問故障的服務,對剩下的進行;輪詢S
18     //RetryRule 會先按輪詢的策略獲取服務,如果服務獲取失敗,則會在指定的時間內進行重試
19 
20     @Bean
21     @LoadBalanced //Ribbon 實現負載均衡
22     public RestTemplate getRestTemplate() {
23         return new RestTemplate();
24     }
25 
26 
27 }

建立Controller層

 1 package com.puyu.springcloud.controller;
 2 
 3 import com.puyu.springcloud.pojo.Dept;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.web.bind.annotation.PathVariable;
 6 import org.springframework.web.bind.annotation.RequestMapping;
 7 import org.springframework.web.bind.annotation.RestController;
 8 import org.springframework.web.client.RestTemplate;
 9 
10 import java.util.List;
11 
12 @RestController
13 public class DeptConsumerController {
14 
15 
16     /*消費者 不應擁有service層*/
17     /*RestTemplate  供我們直接呼叫*/
18     /*(url,實體 :map,class<t> restTemplate)*/
19     @Autowired
20     private RestTemplate restTemplate; //提供多種便捷訪問遠端http服務的方法,簡單的restful服務模板
21 
22     //Ribbon 我們在這裡的地址應該是一個變數 ,通過服務名來訪問
23 
24    private static final String REST_URL_PREFIX = "http://localhost:8001";
25   //  private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";
26 
27     @RequestMapping("/test/ad")
28     public String aa(){
29     return "老子弄死你";
30     }
31 
32     @RequestMapping("/consumer/dept/add")
33     public boolean add(Dept dept) {
34         return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
35     }
36 
37     @RequestMapping("/consumer/dept/get/{id}")
38     public Dept get(@PathVariable("id") Long id) {
39         return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);
40     }
41 
42     @RequestMapping("/consumer/dept/list")
43     public List<Dept> list() {
44         return  restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
45     }
46 }

建立springcloud-consumer-dept-81 啟動類

 1 package com.puyu.springcloud;
 2 
 3 import com.puyu.myrule.PuYuRule;
 4 import org.springframework.boot.SpringApplication;
 5 import org.springframework.boot.autoconfigure.SpringBootApplication;
 6 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 7 import org.springframework.cloud.netflix.ribbon.RibbonClient;
 8 
 9 
10 //Ribbon 和Eureka 整合以後客戶端可以直接呼叫服務端,不用關心埠號和ip地址
11 @SpringBootApplication
12 @EnableEurekaClient // Eureka Client  註冊到Eureka 註冊中心中
13 //在微服務啟動的時候就能去載入 自定義的Ribbon類 ---指定ribbon自定義類  name為 服務名
14 //@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = PuYuRule.class)
15 public class DeptConsumer_81 {
16     public static void main(String[] args) {
17         SpringApplication.run(DeptConsumer_81.class,args);
18     }
19 }

4.新建子專案 springcloud-provider-dept-8001
springcloud-provider-dept-8001---------------服務提供者

新增pom依賴

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <parent>
 6         <artifactId>springcloud</artifactId>
 7         <groupId>com.puyu</groupId>
 8         <version>1.0-SNAPSHOT</version>
 9     </parent>
10     <modelVersion>4.0.0</modelVersion>
11 
12     <artifactId>springcloud-provider-dept-8001</artifactId>
13     <!-- 我們需要拿到實體類,所以需要配置api module-->
14     <dependencies>
15         <!--Hystrix 依賴-->
16         <!--<dependency>
17             <groupId>org.springframework.cloud</groupId>
18             <artifactId>spring-cloud-starter-hystrix</artifactId>
19             <version>1.4.6.RELEASE</version>
20         </dependency>-->
21         <!--   eureka依賴     -->
22         <dependency>
23             <groupId>org.springframework.cloud</groupId>
24             <artifactId>spring-cloud-starter-eureka</artifactId>
25             <version>1.4.6.RELEASE</version>
26         </dependency>
27         <!--actuator完善監控資訊 Hystrid 流監控所需要的jar依賴-->
28         <dependency>
29             <groupId>org.springframework.boot</groupId>
30             <artifactId>spring-boot-starter-actuator</artifactId>
31         </dependency>
32 
33         <dependency>
34             <groupId>com.puyu</groupId>
35             <artifactId>springcloud-api</artifactId>
36             <version>1.0-SNAPSHOT</version>
37         </dependency>
38         <dependency>
39             <groupId>junit</groupId>
40             <artifactId>junit</artifactId>
41             <scope>test</scope>
42         </dependency>
43         <dependency>
44             <groupId>mysql</groupId>
45             <artifactId>mysql-connector-java</artifactId>
46         </dependency>
47         <dependency>
48             <groupId>com.alibaba</groupId>
49             <artifactId>druid</artifactId>
50         </dependency>
51         <dependency>
52             <groupId>ch.qos.logback</groupId>
53             <artifactId>logback-core</artifactId>
54         </dependency>
55         <dependency>
56             <groupId>org.mybatis.spring.boot</groupId>
57             <artifactId>mybatis-spring-boot-starter</artifactId>
58         </dependency>
59         <dependency>
60             <groupId>org.springframework.boot</groupId>
61             <artifactId>spring-boot-starter-web</artifactId>
62             <version>RELEASE</version>
63             <scope>compile</scope>
64         </dependency>
65     </dependencies>
66 
67 </project>

建立application.yml配置檔案

 1 server:
 2   port: 8001
 3 
 4   #mybatis 配置以及制定mapper檔案所在位置
 5 mybatis:
 6   type-aliases-package: com.puyu.springcloud.pojo
 7   config-location: classpath:mybatis/mybatis-config.xml
 8   mapper-locations: classpath:mybatis/mapper/*.xml
 9 
10   #spring配置 
11 spring:
12   application:
13     name: springcloud-provider-dept # 3個服務名字一致
14   datasource:
15     type: com.alibaba.druid.pool.DruidDataSource #阿里巴巴德魯伊
16     driver-class-name: org.gjt.mm.mysql.Driver
17     url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8
18     username: root
19     password: root
20 
21 #eureka 配置   #defaultZone ---釋出到那個註冊中心
22 eureka:
23   client:
24     serviceUrl:
25       defaultZone: http://localhost:7001/eureka/
26   instance:
27     instance-id: springcloud-provider-dept8001 #修改eureka 上的預設描述資訊
28 
29 #info 自定義配置資訊
30 info:
31   app.name: huangpuyu-springcloud # 顯示與springcloud-provider-dept8001 預設描述資訊  點選後項目描述
32   company.name: big.pig.com

resources包下建立 mybatis包存放mybatis-config.xml

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <settings>
 7 <!--   開啟二級快取   -->
 8         <setting name="cacheEnabled" value="true"/>
 9     </settings>
10 </configuration>

resources包下建立 mybatis包>mapper包 存放DeptDao.xml

Sql操作語句存放位置

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="com.puyu.springcloud.dao.DeptDao">
 6     <insert id="addDept" parameterType="Dept">
 7         insert into dept (dname,db_source)
 8         values (#{dname},DATABASE());
 9     </insert>
10 
11     <select id="queryById" resultType="Dept" parameterType="Long">
12         select * from dept where deptno = #{deptno};
13     </select>
14 
15     <select id="queryAll" resultType="Dept" >
16         select * from dept;
17     </select>
18 
19 </mapper>

建立DeptDao層

 1 package com.puyu.springcloud.dao;
 2 
 3 //匯入springcloud專案中的Dept實體類
 4 import com.puyu.springcloud.pojo.Dept;
 5 import org.apache.ibatis.annotations.Mapper;
 6 import org.springframework.stereotype.Repository;
 7 
 8 import java.util.List;
 9 
10 @Mapper
11 @Repository
12 public interface DeptDao {
13 
14     public boolean addDept(Dept dept);
15 
16     public Dept queryById(Long id);
17 
18     public List<Dept> queryAll();
19 }

建立service層

 1 package com.puyu.springcloud.service;
 2 
 3 import com.puyu.springcloud.pojo.Dept;
 4 
 5 import java.util.List;
 6 
 7 public interface DeptService {
 8     public boolean addDept(Dept dept);
 9 
10     public Dept queryById(Long id);
11 
12     public List<Dept> queryAll();
13 }
 1 package com.puyu.springcloud.service;
 2 
 3 import com.puyu.springcloud.dao.DeptDao;
 4 import com.puyu.springcloud.pojo.Dept;
 5 import org.springframework.beans.factory.annotation.Autowired;
 6 import org.springframework.stereotype.Service;
 7 
 8 import javax.xml.ws.ServiceMode;
 9 import java.util.List;
10 
11 @Service
12 public class DeptServiceImpl implements DeptService {
13 
14     @Autowired
15     private DeptDao deptDao;
16 
17     @Override
18     public boolean addDept(Dept dept) {
19         return deptDao.addDept(dept);
20     }
21 
22     @Override
23     public Dept queryById(Long id) {
24         return deptDao.queryById(id);
25     }
26 
27     @Override
28     public List<Dept> queryAll() {
29         return deptDao.queryAll();
30     }
31 }

建立controller層

 1 package com.puyu.springcloud.DeptController;
 2 
 3 import org.springframework.cloud.client.ServiceInstance;
 4 import org.springframework.cloud.client.discovery.DiscoveryClient;
 5 import com.puyu.springcloud.pojo.Dept;
 6 import com.puyu.springcloud.service.DeptService;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.web.bind.annotation.*;
 9 
10 import java.util.List;
11 
12 //提供resetful服務
13 @RestController
14 public class DeptController {
15     @Autowired
16     private DeptService deptService;
17 
18     //獲取一些配置的資訊,得到具體微服務
19     @Autowired
20     private DiscoveryClient client;
21 
22     @PostMapping("/dept/add")
23     public boolean addDept(Dept dept) {
24         return deptService.addDept(dept);
25     }
26 
27     @GetMapping("/dept/get/{id}")
28     public Dept get(@PathVariable("id") Long id) {
29         return deptService.queryById(id);
30     }
31 
32     @GetMapping("/dept/list")
33     public List<Dept> queryAll() {
34         return deptService.queryAll();
35     }
36 
37     //註冊進來的微服務,獲取到一些訊息
38     //獲取微服務列表的一些清單資訊 微服務描述資訊
39     @GetMapping("/dept/discovery")
40     public Object discover(){
41         //獲取微服務的列表清單
42         List<String> services = client.getServices();
43         System.out.println("discovery=>services:"+services);
44         //得到一個具體的微服務資訊,通過具體的微服務id apolicationName
45         List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");
46         for (ServiceInstance instance:instances) {
47             System.out.println(
48                     instance.getHost()+"\t"+
49                     instance.getPort()+"\t"+
50                     instance.getUri()+"\t"+
51                     instance.getServiceId()+"\t"
52             );
53         }
54         return this.client;
55     }
56 
57 
58 }

建立springcloud-provider-dept-8001 專案啟動類

 1 package com.puyu.springcloud;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 import org.springframework.boot.web.servlet.ServletRegistrationBean;
 6 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 7 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 8 import org.springframework.context.annotation.Bean;
 9 
10 import javax.servlet.ServletRegistration;
11 
12 
13 @SpringBootApplication
14 @EnableEurekaClient //配置完@EnableEurekaClient 在服務啟動後會自動註冊到eureka中 (客戶端自動註冊到服務端)
15 @EnableDiscoveryClient //discovery 服務發現
16 public class DeptProvider_8001 {
17     public static void main(String[] args) {
18         SpringApplication.run(DeptProvider_8001.class, args);
19     }
20 
21     //增加 一個servelt(hystrix流監控)
22    /* @Bean
23     public ServletRegistration hystrixMetricsStreamServlet(){
24         ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
25         registrationBean.addUrlMappings("/actuator/hystrix.stream");
26         return registrationBean;
27     }*/
28 }

5.新建子專案springcloud-eureka-7001

Eureka 註冊中心

新增pom依賴

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <parent>
 6         <artifactId>springcloud</artifactId>
 7         <groupId>com.puyu</groupId>
 8         <version>1.0-SNAPSHOT</version>
 9     </parent>
10     <modelVersion>4.0.0</modelVersion>
11 
12     <artifactId>springcloud-eureka-7001</artifactId>
13     <!--eureka導依賴-->
14     <dependencies>
15         <dependency>
16             <groupId>org.springframework.cloud</groupId>
17             <artifactId>spring-cloud-starter-eureka-server</artifactId>
18             <version>1.4.6.RELEASE</version>
19         </dependency>
20         <dependency>
21             <groupId>org.springframework.boot</groupId>
22             <artifactId>spring-boot-devtools</artifactId>
23         </dependency>
24     </dependencies>
25 
26 </project>

建立application.yml

 1 server:
 2   port: 7001
 3 
 4 #eureka
 5 eureka:
 6   instance:
 7     hostname: eureka7001.com #eureka 服務端例項名字
 8   client:
 9     register-with-eureka: false #表示是否向eureka註冊中心註冊自己
10     fetch-registry: false #如果為false 表示自己是註冊中心
11     serviceUrl:
12       #defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
13       單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
14       #叢集關聯
15       #defaultZone: http://7002的伺服器ip地址:7002/eureka/,http://7003的伺服器ip地址:7003/eureka/  (7001——關聯7002.7003 註冊中心叢集)

建立springcloud-eureka-7001 啟動類

 1 package com.puyu.springcloud;
 2 
 3 
 4 import org.springframework.boot.SpringApplication;
 5 import org.springframework.boot.autoconfigure.SpringBootApplication;
 6 import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 7 
 8 @SpringBootApplication
 9 //EnableEurekaServer 服務端啟動類,可以接受別人註冊進來
10 @EnableEurekaServer
11 public class EurekaService_7001 {
12 
13     public static void main(String[] args) {
14         SpringApplication.run(EurekaService_7001.class,args);
15     }
16 }

至此springcloud 專案最簡單的 服務消費者 服務提供者 服務註冊中心 搭建完成,後面還有 eureka的叢集、Ribbon、Feign、Hystrix、zuul、springcloud-config配置管理

要理解springcloud的中心思想,是服務個體獨立,經由Eureka註冊中心管理各個服務。

下面看下執行結果

首先執行Eureka註冊中心,在執行provider服務提供者,再執行consumer服務消費者

資料訪問結果