Eureka+SpringCloud微服务(入门一)
项目地址
[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.工程编写
- 创建父工程
- 编写payment工程
1.热部署插件(不推荐使用)
添加依赖
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
添加插件到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>
修改Idea设置

配置,(我使用的为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微服务(入门一)的更多相关文章
- springCloud微服务入门
目录 前言 Eureka 注册中心server 新建 配置 服务提供者service 新建 配置 服务消费者controller 新建 配置 使用 Feign负载均衡 前言 springCloud是一 ...
- 史上最简单的springcloud微服务入门实例,满足企业日常需求,开箱即用,工资翻倍不是梦
在传统的IT行业软件大多都是各种独立系统的堆砌,这些系统的问题总结来说就是扩展性差,可靠性不高,维护成本高.到后面引入了SOA服务化,但是,由于 SOA 早期均使用了总线模式,这种总线模式是与某种技术 ...
- 微服务入门三:SpringCloud Alibaba
一.什么是SpringCloud Alibaba 1.简介 1)简介 阿里云未分布式应用开发提供了一站式解决方案.它包含了开发分布式应用程序所需的所有组件,使您可以轻松地使用springcloud开发 ...
- springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin
相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展.会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新 ...
- SpringCloud微服务(01):Eureka组件,管理服务注册与发现
本文源码:GitHub·点这里 || GitEE·点这里 一.Eureka基本架构 1.Eureka简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,SpringCl ...
- springcloud微服务实战:Eureka+Zuul+Ribbon+Hystrix+SpringConfig
原文地址:http://blog.csdn.net/yp090416/article/details/78017552 springcloud微服务实战:Eureka+Zuul+Ribbon+Hyst ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_3-04 SpringCloud微服务核心组件Eureka介绍和闭源后影响
笔记 4.SpringCloud微服务核心组件Eureka介绍和闭源后影响 简介: SpringCloud体系介绍 官方地址:http://projec ...
- SpringCloud微服务(基于Eureka+Feign+Hystrix+Zuul)
一.搭建注册中心 1.1.创建一个cloud-service项目 1.2:POM文件依赖 1 <?xml version="1.0" encoding="UTF-8 ...
- SpringCloud微服务治理技术入门(SCN)
1.集群.分布式.微服务 首先先理解三个感念 什么是集群?: 同一个业务,部署在多个服务器上,目的是实现高可用,保证节点可用! 什么是分布式?: 一个业务分拆成多个子业务,部署在不同的服务器上,每个子 ...
- Java生鲜电商平台-微服务入门与服务的拆分架构实战
Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在“强大”的JSP上面,那时候SOA已经算是新技术了 ...
随机推荐
- webrtc编译,不使用内置boringssl,使用openssl的
前言 在项目开发过程中,会遇到使用https.TLS.DTLS等场景,这些第三方库一般会使用openssl作为加密套件.例如,qt中加密套件就会使用openssl,但是webrtc会默认使用borin ...
- HDLBits答案——Verilog Language
Verilog Language 1 Basics 1.1 Wire module top_module( input in, output out ); assign out = in; endmo ...
- php 导出图片为pdf
require_once ROOTPATH . 'tcpdf/vendor/autoload.php';$html='';if($html){ mpdf($html); }else{ echo &qu ...
- Mybatis——Plus :表与表之间的关系:1对多和多对一
Mybatis--plus我大致整理出两种方案: 第一种:第三方mybatis-plus 插件,注解式开发 Mybatis-Plus-Relation ( mprelation ) : mybatis ...
- win7使用onedrive右键托盘图标中文不显示问题
前言 win7 用的 onedrive不能在微软官网下载,用不了,所以需要下载 win7可以使用的版本. onedrive_for_win7.exe 解决问题 重启电脑解决 其他 我看贴吧说是文本放大 ...
- JVM面试点汇总
JVM面试点汇总 我们会在这里介绍我所涉及到的JVM相关的面试点内容,本篇内容持续更新 我们会介绍下述JVM的相关面试点: JVM内存结构 内存溢出问题 方法区与永久代和元空间 JVM内存参数 JVM ...
- Android ViewPager2 + Fragment + BottomNavigationView 联动
Android ViewPager2 + Fragment + BottomNavigationView 联动 本篇主要介绍一下 ViewPager2 + Fragment + BottomNavig ...
- JavaEE Day07 HTML
今日内容 Web概念概述 HTML 一.Web概念概述 1. JavaWeb:使用Java语言开发的基于互联网的项目 2.软件架构 C/S架构:Client/Server--- 客户端/服务器端(安卓 ...
- 单节锂电池充电管理芯片,IC电路图
PW4054 是一款性能优异的单节锂离子电池恒流/恒压线性充电器.PW4054 适合给 USB 电源以及适配器电源供电.基于特殊的内部 MOSFET 架构以及防倒充电路, PW4054 不需要外接检测 ...
- js迭代循环
一.for loop for (let i = 0; i < products.length; i++) { console.log(products[i]); } 支持循环中断,可以用brea ...