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服务消费者

 

 

 

 

 

数据访问结果

posted @ 2020-11-04 23:16  RunawayProgrammer  阅读(461)  评论(0编辑  收藏  举报