创建一个SpringCloud项目
创始人
2024-03-13 01:59:40

文章目录

    • 1.首先在**SpringCloud官网**中查看依赖版本号
    • 2.创建主Maven项目:
      • 在pom文件中引入依赖
    • 3.再在这个Maven项目中创建子模块(子模块也是Maven)
      • (1)创建一个数据库db01和表dept
      • (2)创建实体类dept(注意:**每个实体类都要进行序列化**【实现Serializable接口】)
      • (3)创建服务提供者:
      • (4)创建服务消费者:
      • (5)创建eureka服务注册中心
      • (6)对服务提供者进行Eureka配置
        • 自我保护机制:
      • (7)建立Eureka集群

SpringCloud官网
SpringCloud中文文档
Maven依赖仓库

1.首先在SpringCloud官网中查看依赖版本号

查看对应的SpringBoot版本号。
(SpringCloud依赖于SpringBoot,所以一个SpringCloud项目必须引入SpringBoot)
在这里插入图片描述
在这里插入图片描述

2.创建主Maven项目:

在pom文件中引入依赖

  UTF-81.81.84.121.2.171.16.185.1.471.1.161.3.0org.springframework.bootspring-boot-dependencies2.3.2.RELEASEpomimportorg.springframework.cloudspring-cloud-dependenciesHoxton.SR11pomimportcom.alibaba.cloudspring-cloud-alibaba-dependencies2.1.0.RELEASEpomimportmysqlmysql-connector-java${mysql.version}com.alibabadruid${druid.version}org.mybatis.spring.bootmybatis-spring-boot-starter${mybatis.spring.boot.version}junitjunit${junit.version}log4jlog4j${log4j.version}org.projectlomboklombok${lombok.version}true

3.再在这个Maven项目中创建子模块(子模块也是Maven)

三个子模块:
在这里插入图片描述

(1)创建一个数据库db01和表dept

在这里插入图片描述

(2)创建实体类dept(注意:每个实体类都要进行序列化【实现Serializable接口】)

在这里插入图片描述

什么是链式写法:

//正常情况下:
Dept dept=new Dept();
dept.setDeptno(1);
dept.setDeptname("11");
//链式写法:
dept.setDeptno(1).setDeptname("11");

Dept类

@Data
@NoArgsConstructor
@Accessors(chain = true) //链式写法
public class Dept implements Serializable {/*** 主键*/private Long deptno;private String deptname;/*** 这个数据存在哪个数据库的字段中* 微服务 一个服务对应一个数据库* 同一个信息可能存在不同的数据库中*/private String db_source;public Dept(String deptname) {this.deptname = deptname;}}

pom文件:

    springcloud-apiorg.projectlomboklombok

(3)创建服务提供者:

在这里插入图片描述
pom文件:

    com.atguigu.springcloudspringcloud-api1.0-SNAPSHOTjunitjunitmysqlmysql-connector-javacom.alibabadruidorg.mybatis.spring.bootmybatis-spring-boot-starterorg.springframework.bootspring-boot-testorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-jettyorg.springframework.bootspring-boot-devtools

application.yml配置文件:

server:port: 8001
mybatis:type-aliases-package: com.springcloud.pojomapper-locations: classpath:mybatis/mapper/*.xmlconfig-location: classpath:mybatis/mybatis-config.xml
spring:datasource:url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=UTF-8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver

mybatis-config.xml





DeptMapper.xml


insert into dept (deptname,db_source)values (#{deptname},DATABASE())

DeptController

@RestController
public class DeptController {@Autowiredprivate DeptService deptService;@PostMapping("/dept/add")public boolean addDept(Dept dept){return deptService.addDept(dept);}@GetMapping("/dept/get/{id}")public Dept get(@PathVariable("id") Long id){return deptService.findById(id);}@GetMapping("/dept/list")public List getAll(){return deptService.findAll();}
}

dao、service省略…

启动类:

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

(4)创建服务消费者:

消费者没有service层
在这里插入图片描述
pom文件:

    com.atguigu.springcloudspringcloud-api1.0-SNAPSHOTorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-devtools

DeptConsumerController:

@RestController
public class DeptConsumerController {//消费者 没有Service层//RestTemplate....供我们直接调用 注册到Spring中// url,实体:Map,Class responseType@Autowiredprivate RestTemplate restTemplate;//提供多种便携访问远程http服务的方法,简单的Restful服务模板private static final String REST_URL_PREFIX="http://localhost:8001";@RequestMapping("/consumer/dept/get/{id}")public Dept get(@PathVariable("id") Long id){return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);}@RequestMapping("/consumer/dept/add")public boolean add(Dept dept){return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);}@RequestMapping("/consumer/dept/list")public List findAll(){return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class);}}

ConfigBean:

@Configuration
public class ConfigBean {@Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}}

启动类:

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

application.yml文件:

server:port: 80

(5)创建eureka服务注册中心

Eureka:
Eureka是Netflix的一个子模块,Eureka是基于Rest的服务,它是一个注册中心(让服务在启动时注册进去)
在这里插入图片描述
Eureka是C-S模式(Client-Server)
它有两个组件,一个是Eureka Client,一个是Eureka Server
Eureka Server:提供服务发现的能力,各个微服务启动时,会通过Eureka Client向Eureka Server进行注册自己的信息(例如网络信息),Eureka Server会存储该服务的信息。
Eureka Client:是一个Java客户端,用于简化与Eureka Server的交互。
微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒)

在这里插入图片描述
pom文件:

    springcloud-eureka-7001org.springframework.cloudspring-cloud-starter-eureka-server1.4.7.RELEASEorg.springframework.bootspring-boot-devtools

application.yml配置类

server:port: 7001
eureka:instance:hostname: localhost  #Eureka服务端的实例名称client:register-with-eureka: false #表示是否向eureka注册中心注册自己fetch-registry: false #false表示自己为注册中心service-url:  #监控页面defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

启动类:

@SpringBootApplication
@EnableEurekaServer //服务端的启动类
public class EurekaServer_7001 {public static void main(String[] args) {SpringApplication.run(EurekaServer_7001.class,args);}
}

注意:
SpringBoot、SpringCloud、eureka的版本号要对应
我使用的版本号分别是
SpringBoot:

      org.springframework.bootspring-boot-dependencies2.3.2.RELEASEpomimport

SpringCloud:

org.springframework.cloudspring-cloud-dependenciesHoxton.SR11pomimport

Eureka:

        org.springframework.cloudspring-cloud-starter-eureka-server1.4.7.RELEASE

然后浏览器访问 http://localhost:7001/ 会显示:
在这里插入图片描述

(6)对服务提供者进行Eureka配置

在springcloud-provider-dept-8001模块中:

在pom文件中导入eureka依赖:

        org.springframework.cloudspring-cloud-starter-eureka1.4.6.RELEASE

修改application.yml配置文件

spring:datasource:url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=UTF-8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverapplication:name: springcloud-provider-dept
eureka:client:service-url:defaultZone: http://localhost:7001/eureka/instance:instance-id: springcloud-provider-dept-8001 #修改eureka上默认描述信息

在启动类上添加注解@EnableEurekaClient

@SpringBootApplication
@EnableEurekaClient //在服务器启动后自动注册到eureka中
public class DeptProvide_8001 {public static void main(String[] args) {SpringApplication.run(DeptProvide_8001.class,args);}
}

先启动EurekaServer,也就是eureka-7001模块
再启动EurekaClient,也就是springcloud-provider-dept-8001模块
然后访问http://localhost:7001/
在这里插入图片描述

过一段时间会出现警告:
在这里插入图片描述
这是Eureka的自我保护机制。

自我保护机制:

某时刻某个微服务不可用了,Eureka不会立刻清理,依旧会对微服务的信息进行保存。
默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制
Eureka Server自动进入自我保护机制,此时会出现以下几种情况:

1、Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
2、Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
3、当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
关闭自我保护机制:
在application.yml配置文件中:
可以关闭自我保护机制,但是不推荐关闭

  server:enable-self-preservation: false #关闭自我保护机制(不推荐关闭)

监控信息的完善:
在这里插入图片描述
在springcloud-provider-dept-8001模块pom文件中导入依赖:

        org.springframework.bootspring-boot-starter-actuator

在application.yml文件中进行配置:

info:app.name: zsy-springcloudcompany.name: blog.zzz.com

跳转结果:
在这里插入图片描述

获取注册微服务的一些信息:
在springcloud-provider-dept-8001模块中:

DeptController:

    //获取一些配置的信息,得到具体的微服务@Autowiredprivate DiscoveryClient discoveryClient;//注册进来的微服务 获取一些消息@GetMapping(value = "/dept/discovery")public Object discovery(){
//        获取微服务列表的清单List service=discoveryClient.getServices();System.out.println("discovery=>services:"+service);
//        得到一个具体的微服务信息List instances=discoveryClient.getInstances("SPRINGCLOUD-PROVIDER-DEPT");for(ServiceInstance instance:instances){System.out.println(instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri()+"\t"+instance.getServiceId());}return this.discoveryClient;}

访问这个接口:
在这里插入图片描述

(7)建立Eureka集群

在这里插入图片描述
这三个模块的各种配置都相同(pom文件、application.yml、启动类)
在这里插入图片描述
修改hosts文件:
在这里插入图片描述

在这里插入图片描述
修改application.yml文件:
7001:

 defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

在这里插入图片描述
7002:

在这里插入图片描述
7003:
在这里插入图片描述
同时启动7001,7002,7003
这样就相当于建立了一个Eureka集群
作用:例如7001崩了,可以使用7002/7003

修改服务提供者application.yml文件

defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

在这里插入图片描述

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...