项目地址

[CloudStudy项目](zko0/cloudStudy: Springcloud学习工程 (github.com))

1.依赖版本

  • cloud:Hoxton.SR1
  • boot:2.2.2.RELEASE
  • cloud alibaba 2.1.0RELEASE
  • Java 8
  • Maven>3.5
  • Mysql>5.7

2.工程编写

  1. 创建父工程
  2. 编写payment工程

1.热部署插件(不推荐使用)

  1. 添加依赖

    <!--热部署-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
    </dependency>
  2. 添加插件到Pom.xml

    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.4.1</version>
    <configuration>
    <addResources>true</addResources>
    </configuration>
    </plugin>
    </plugins>
    </build>
  3. 修改Idea设置

  4. 配置,(我使用的为idea2022,2021.2 之前方法不同,需要百度)

2.RestTemplate

提供多种便携访问远程Http服务的方法,是一种简单辨析的restful服务模板类。Spring提供的用于访问Rest服务端客户端模板工具集。

@Configuration
public class ApplicationContextConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@RestController
@Slf4j
public class OrderController {
private static final String PAYMENT_URL="http://localhost:8001";
@Resource
private RestTemplate restTemplate; @GetMapping("/consumer/payment/create")
public CommonResult<Payment> create(Payment payment){
return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);
} @GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
}

剩余部分在阳哥CLoud2.0的前15P,自行编写。

3.服务注册中心

1.Eureka单机

一.EurekaServer

新建项目cloud-eureka-server7001

pom.xml:

<dependencies>
<!--eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--引入自己定义的api通用包,可以使用payment支付Entity-->
<dependency>
<groupId>cn.zko0.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--boot web actuator-->
<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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>

application.yml:

server:
port: 7001 eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

入口类:

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

二.EurekaClient-Provider

在provider项目上添加eureka-client依赖

<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

在入口类加入Enable

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

配置文件添加配置:

这里的service-url需要参考Server中配置文件的service-url

spring:
application:
name: cloud-payment-service
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka

测试:

Eureka自我保护机制(暂时忽略)

其中Eureka注册服务名称为Spring.application.name名称

三.EurekaClient-Consuemr

1.添加eureka-client依赖:

<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2.入口类添加Enable

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

3.配置文件添加配置信息

spring:
application:
name: cloud-order-server
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka

4.测试

eureka注册开关:

2.Eureka集群+LoadBalanced服务调用

1.创建Eureka-Server7002

cloud-eureka-server7002

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

2.相互注册,相互守望

修改hostname,不能7001和7002都为localhost

修改配置文件:

127.0.0.1       eureka7001.com
127.0.0.2 eureka7002.com
127.0.0.3 eureka7003.com

修改项目配置文件,相互注册,相互守望

cloud-eureka-server7002的pom.xml文件修改:

server:
port: 7002 eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/

cloud-eureka-server7001的pom.xml文件修改:

server:
port: 7001 eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/

3.测试集群

4.将微服务配置进集群

将payment和order项目的配置文件修改service-url的地址

5.测试微服务的配置

6.多个提供者集群搭建

新建cloud-provider-payment-8002

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

pom.xml:

server:
port: 8002

提取port信息到controller,方法后面方法调用显示对应的信息:

简单测试服务是否注册:

order调用只会调用8001,因为在order中已经写死了调用地址

修改Controller调用地址

重启Order调用,出错:

只有@LoadBalanced修饰的restTemplate才能通过服务名调用,否则只能通过ip+port调用

7.最后的测试

4.细节完善

1.去除服务主机名

eureka可以看到主机名,让它不显示

修改8001和8002的application.yml:

测试:

2.鼠标悬停显示Ip+port

如果你已经显示了,则不需要配置(我的项目悬停默认显示Ip和端口号)

测试:

5.服务发现

能够通过接口调用,获取到Eureka上的所有服务信息

在provider-payment-8001上添加discovery()方法:

@GetMapping(value = "/payment/discovery")
public Object discovery() {
//获取在Eureka中注册的services有哪些
List<String> services = discoveryClient.getServices();
for (String element:services) {
log.info("*****element:{}",element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}

在启动类上添加注解:

测试:

6.Eureka自我保护机制

1.保护模式现象

Eureka进入保护模式:

2.保护模式是什么?

Eureka Server会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何的微服务。

翻译成人话:某个微服务不可用,Eureka不会立刻清理,依然会对该微服务的信息进行保存

CAP中的AP

这句话没搞懂,后面慢慢学

3.为什么需要保护模式

默认情况下,EurekaServer在一段事件里没有接收到某个微服务实例的心跳,EurekaServer会注销该实例。(90s)

但是当网络分区故障,EurekaServer和微服务之间无法正常通信了,上面的行为就会很危险。

因为这时:微服务是健康的(这个微服务不应该被注销掉

Eureka自我保护模式如何启动:当EurekaServer节点短时间内有很多Client丢失,那么这个节点就会进入保护模式。

4.设计理念

宁可保留错误的服务注册信息,也不盲目的注销掉任何健康的服务实例。

5.如何关闭自我保护

Eureka默认开启自我保护机制

首先关闭集群搭建,只开启7001

Eureka-Server-7001关闭自我保护模式,同时将心跳时间修改为2s(2s内没有收到就销毁)

Eureka-Client关闭自我保护:

测试:自我保护模式已关闭

这时关闭8001项目,Eureka会立马删除服务:

Eureka+SpringCloud微服务(入门一)的更多相关文章

  1. springCloud微服务入门

    目录 前言 Eureka 注册中心server 新建 配置 服务提供者service 新建 配置 服务消费者controller 新建 配置 使用 Feign负载均衡 前言 springCloud是一 ...

  2. 史上最简单的springcloud微服务入门实例,满足企业日常需求,开箱即用,工资翻倍不是梦

    在传统的IT行业软件大多都是各种独立系统的堆砌,这些系统的问题总结来说就是扩展性差,可靠性不高,维护成本高.到后面引入了SOA服务化,但是,由于 SOA 早期均使用了总线模式,这种总线模式是与某种技术 ...

  3. 微服务入门三:SpringCloud Alibaba

    一.什么是SpringCloud Alibaba 1.简介 1)简介 阿里云未分布式应用开发提供了一站式解决方案.它包含了开发分布式应用程序所需的所有组件,使您可以轻松地使用springcloud开发 ...

  4. springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

    相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展.会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新 ...

  5. SpringCloud微服务(01):Eureka组件,管理服务注册与发现

    本文源码:GitHub·点这里 || GitEE·点这里 一.Eureka基本架构 1.Eureka简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,SpringCl ...

  6. springcloud微服务实战:Eureka+Zuul+Ribbon+Hystrix+SpringConfig

    原文地址:http://blog.csdn.net/yp090416/article/details/78017552 springcloud微服务实战:Eureka+Zuul+Ribbon+Hyst ...

  7. 小D课堂 - 新版本微服务springcloud+Docker教程_3-04 SpringCloud微服务核心组件Eureka介绍和闭源后影响

    笔记 4.SpringCloud微服务核心组件Eureka介绍和闭源后影响     简介:         SpringCloud体系介绍             官方地址:http://projec ...

  8. SpringCloud微服务(基于Eureka+Feign+Hystrix+Zuul)

    一.搭建注册中心 1.1.创建一个cloud-service项目 1.2:POM文件依赖 1 <?xml version="1.0" encoding="UTF-8 ...

  9. SpringCloud微服务治理技术入门(SCN)

    1.集群.分布式.微服务 首先先理解三个感念 什么是集群?: 同一个业务,部署在多个服务器上,目的是实现高可用,保证节点可用! 什么是分布式?: 一个业务分拆成多个子业务,部署在不同的服务器上,每个子 ...

  10. Java生鲜电商平台-微服务入门与服务的拆分架构实战

    Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在“强大”的JSP上面,那时候SOA已经算是新技术了 ...

随机推荐

  1. Go语言核心36讲44

    今天,我们来讲另一个与I/O操作强相关的代码包bufio.bufio是"buffered I/O"的缩写.顾名思义,这个代码包中的程序实体实现的I/O操作都内置了缓冲区. bufi ...

  2. 读 Clean Code,关于变量命名和可维护代码

    原文见 http://mindprod.com/jgloss/unmain.html 如何写出不能维护的代码 如何程序命名 容易输入的名字.比如:Fred,asdf 单字母的变量名.比如:a,b,c, ...

  3. 基于python的数学建模---机场航线设计

    数据集 拿走: 链接:https://pan.baidu.com/s/1zH5xhpEmx2_u5qO9W4gCkw 提取码:2wl5 数据集来自航空业,有一些关于航线的基本信息.有某段旅程的起始点和 ...

  4. (Java)设计模式:创建型

    前言 这篇内容是从另一篇:UML建模.设计原则 中分离出来的,原本这个创建型设计模式是和其放在一起的 但是:把这篇创建型设计模式放在一起让我贼别扭,看起来贼不舒服,越看念头越不通达,导致老衲躺在床上脑 ...

  5. JDK中内嵌JS引擎介绍及使用

    原文: JDK中内嵌JS引擎介绍及使用 - Stars-One的杂货小窝 最近研究阅读这个APP,其主要功能就是通过一个个书源,从而实现移动端阅读的体验 比如说某些在线小说阅读网站,会加上相应的广告, ...

  6. 【大数据】kafka-02:Kafka Connect内容、原理及使用

    〇.概述 1.常见资料 (1)confluent https://docs.confluent.io/5.4.0/connect/kafka-connect-jdbc/sink-connector/s ...

  7. 【大数据面试】Flink 01 概述:包含内容、层次架构、运行组件、部署模式、任务提交流程、任务调度概念、编程模型组成

    一.概述 1.介绍 对无界和有界数据流进行有状态计算的分布式引擎和框架,并可以使用高层API编写分布式任务,主要包括: DataSet API(批处理):静态数据抽象为分布式数据集,方便使用操作符进行 ...

  8. docker入门(利用docker部署web应用)

    第一章 什么是docker1.1 docker的发展史2010年几个年轻人成立了一个做PAAS平台的公司dotCloud.起初公司发展的不错,不但拿到过一些融资,还获得了美国著名孵化器YCombina ...

  9. Spring IOC源码(一):IOC容器启动流程核心方法概览

    Spring有两种方式加载配置,分别为xml文件.注解的方式,对于xml配置的方式相信大家都不陌生,往往通过new ClassPathXmlApplicationContext("*.xml ...

  10. 文件压缩和vi编辑器

    一.压缩,解压缩 1.gzip 和 bzip2 gzip和bzip都是压缩软件,比如windows里的好压和360 压缩或微软自带的等等 命令格式是:gzip或者bzip  + 0-9的压缩等级(数字 ...