1.基本介绍
1.学前说明
![image-20240324170147708](https://img-blog.csdnimg.cn/img_convert/6826cbea4c0e88674b4d76ce03fc114e.png)
2.当前架构分析
1.示意图
![image-20240324171627695](https://img-blog.csdnimg.cn/img_convert/7cfd27a140d09179f23029fe4f8cd0ac.png)
2.问题分析
![image-20240324171708729](https://img-blog.csdnimg.cn/img_convert/7220f7c0e58ec37bbbb1b74c21cd2be8.png)
3.引出Eureka
1.项目架构分析
![image-20240324172210983](https://img-blog.csdnimg.cn/img_convert/279815d6a52214420e50e6eb530c5fc1.png)
2.上图解读
![image-20240324172631328](https://img-blog.csdnimg.cn/img_convert/895e3bc3b9856d1d761442e1502be226.png)
2.创建单机版的Eureka
1.创建 e-commerce-eureka-server-9001 子模块
![image-20240324190850244](https://img-blog.csdnimg.cn/img_convert/5da7ca1198fc9a22ad1ec7dcc45386b8.png)
2.检查父子pom.xml
1.子 pom.xml
![image-20240324191046396](https://img-blog.csdnimg.cn/img_convert/ec58e8b4fc6d4276916371e59b3e3212.png)
2.父 pom.xml
![image-20240324191140546](https://img-blog.csdnimg.cn/img_convert/21109002fe8c64b9fb7b3c8dd328f286.png)
3.pom.xml 引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<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.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>
<dependency>
<groupId>org.example</groupId>
<artifactId>e_commerce_center-common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
4.application.yml 配置eureka服务
server:
port: 9001
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
5.com/sun/springcloud/EurekaApplication.java 编写启动类运行测试
package com.sun.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
![image-20240324195158793](https://img-blog.csdnimg.cn/img_convert/a06a4c03d5eb20aab45de68b443372d6.png)
6.会员中心模块作为Eureka Client示意图
![image-20240324195456887](https://img-blog.csdnimg.cn/img_convert/26170fe6439c77be183b12049522783e.png)
7.member-service-provider-10001 模块作为Eureka Client
1.pom.xml引入Eureka 客户端依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.application.yml 配置Eureka Client
server:
port: 10001
spring:
application:
name: member-service-provider-10001
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:9001/eureka
3.修改启动类添加注解
![image-20240324202947223](https://img-blog.csdnimg.cn/img_convert/3025ec0ef49151790db26ddd6c652810.png)
8.测试
1.先启动Eureka 服务端,再启动Eureka 客户端
2.访问(http://localhost:9001/) 进入Eureka 服务端
![image-20240324202316203](https://img-blog.csdnimg.cn/img_convert/6565c11014957d45c44908de2316eed6.png)
![image-20240324202339027](https://img-blog.csdnimg.cn/img_convert/ea1462a3392d476ed64d19442ced2b52.png)
9.服务消费模块作为Eureka Client示意图
![image-20240324202615904](https://img-blog.csdnimg.cn/img_convert/c38686423249ca1a419065120de590dd.png)
10.member-service-consumer-81 模块作为Eureka Client
1.pom.xml 引入Eureka 客户端依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.application.yml 配置Eureka Client
server:
port: 81
spring:
application:
name: member-service-consumer-81
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:9001/eureka
3.修改启动类添加注解
![image-20240324205028005](https://img-blog.csdnimg.cn/img_convert/6f775d4cff040463c31c01becdafdd17.png)
11.测试
1.先启动Eureka 服务端,再启动Eureka 客户端
2.访问(http://localhost:9001/) 进入Eureka 服务端
![image-20240324205133634](https://img-blog.csdnimg.cn/img_convert/0312e496b1be70c8324fceb1453bb461.png)
12.梳理Service Consumer Service Provider Eureka Server 维护机制
- 简单来说Eureka就两个功能,发现服务,注册服务!
- 基本流程就是会员中心启动之后将自己的信息注册到Eureka Server(注册服务),服务消费者启动之后通过Eureka Server来发现服务(发现服务),得到会员中心的调用地址,然后通过rpc远程调用
![image-20240324210200932](https://img-blog.csdnimg.cn/img_convert/389af52eb265fe06a214ef46179c1fa1.png)
13.Eureka自我保护模式
1.基本介绍
![image-20240325085940410](https://img-blog.csdnimg.cn/img_convert/c478ab1efb30cf955bd7bfde45d470dd.png)
2.小结
- 服务在注册之后会不断地向服务端发送心跳,正常情况下如果90s内没有心跳,则服务端会认为这个客户端down掉了,就会清除记录
- 但是一旦自我保护机制开启,即使90s内没有心跳,也不会请求记录
3.禁用自我保护模式
1.服务端配置
server:
port: 9001
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000
2.客户端配置
server:
port: 10001
spring:
application:
name: member-service-provider-10001
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url:
username:
password:
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.sun.springcloud.entity
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:9001/eureka
instance:
lease-renewal-interval-in-seconds: 1
lease-expiration-duration-in-seconds: 2
3.启动后访问http://localhost:9001/
![image-20240325092003298](https://img-blog.csdnimg.cn/img_convert/7519952d93ade2e091ae121a3fc7494a.png)
4.关闭掉客户端
![image-20240325092029292](https://img-blog.csdnimg.cn/img_convert/f46acb710eeb039d21dae3071ec25f60.png)
3.搭建Eureka多服务集群
1.示意图
![image-20240325092723818](https://img-blog.csdnimg.cn/img_convert/f1d69e140d0640c655be0d888c165842.png)
2.创建e-commerce-eureka-server-9002子模块作为第二个Eureka服务
![image-20240325093013429](https://img-blog.csdnimg.cn/img_convert/026a771ab941192b988dc2f0e4bd4c40.png)
3.pom.xml 引入依赖(跟9001子模块的一样)
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<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.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>
<dependency>
<groupId>org.example</groupId>
<artifactId>e_commerce_center-common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
4.application.yml 配置
server:
port: 9002
eureka:
instance:
hostname: eureka9002.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka9001.com:9001/eureka/
5.修改9001模块的 application.yml 配置完成两个服务相互注册
server:
port: 9001
eureka:
instance:
hostname: eureka9001.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka9002.com:9002/eureka/
6.编写启动类
package com.sun.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication9002 {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication9002.class, args);
}
}
7.配置Hosts运行Eureka
1.解释
- 由于上面配置的两个Eureka服务使用的是域名eureka9001.com和eureka9002.com
- 所以需要配置hosts文件
2.hosts文件所在位置
![image-20240325095640615](https://img-blog.csdnimg.cn/img_convert/17a21376df5108d69030be6ef72adac0.png)
3.修改Hosts文件
- 这样eureka9002.com和eureka9001.com都表示127.0.0.1了
- 如果这里不能直接修改就把文件复制一份在别的地方修改一下然后覆盖这个文件即可
- 注意:你如果现在开的代理服务器,hosts文件是不生效的!
![image-20240325095927191](https://img-blog.csdnimg.cn/img_convert/4f6a666bfffc1004dcc5db58b4a04c66.png)
4.启动这两个服务,访问测试
![image-20240325102139626](https://img-blog.csdnimg.cn/img_convert/d8ba3c03a804c094224607068b9e575c.png)
![image-20240325102128008](https://img-blog.csdnimg.cn/img_convert/6029868d48e13551eb2fb90145fd54c7.png)
8.Eureka多个服务端互相注册配置文件理解
1.服务端一(eureka9001.com:9001)
server:
port: 9001
eureka:
instance:
hostname: eureka9001.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka9002.com:9002/eureka/
2.服务端二(eureka9002.com:9002)
server:
port: 9002
eureka:
instance:
hostname: eureka9002.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka9001.com:9001/eureka/
4.将客户端注册到Eureka服务集群
1.示意图
![image-20240325103431797](https://img-blog.csdnimg.cn/img_convert/0c1b1e35d5f61599170794b0a2b00a82.png)
2.修改81客户端的application.yml
server:
port: 81
spring:
application:
name: member-service-consumer-81
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka9001.com:9001/eureka/, http://eureka9002.com:9002/eureka/
3.修改10001客户端的application.yml
server:
port: 10001
spring:
application:
name: member-service-provider-10001
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka9001.com:9001/eureka/, http://eureka9002.com:9002/eureka/
5.启动四个服务
![image-20240325104314071](https://img-blog.csdnimg.cn/img_convert/8ff49cedb538a24027722cd9fcfa717e.png)
6.测试访问
![image-20240325104410526](https://img-blog.csdnimg.cn/img_convert/c4ce2bf614e26263400c13b435755bdc.png)
![image-20240325104420924](https://img-blog.csdnimg.cn/img_convert/09a015b465c38c0dc1fcaeca57f55206.png)
7.Eureka多个客户端注册多个服务端配置文件理解
1.客户端一(端口81)
server:
port: 81
spring:
application:
name: member-service-consumer-81
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka9001.com:9001/eureka/, http://eureka9002.com:9002/eureka/
2.客户端二(端口10001)
server:
port: 10001
spring:
application:
name: member-service-provider-10001
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka9001.com:9001/eureka/, http://eureka9002.com:9002/eureka/
5.搭建会员中心服务提供方集群
1.示意图
![image-20240325105527585](https://img-blog.csdnimg.cn/img_convert/e2a2ac6fb13712be426d7152d39d9322.png)
2.基本说明
![image-20240325105709044](https://img-blog.csdnimg.cn/img_convert/9e3df9b040b9a278b7518c9ed7923174.png)
3.创建 member-service-provider-10002 子模块与10001功能完全一致
![image-20240325105924475](https://img-blog.csdnimg.cn/img_convert/683c8da3cdb89dbb113e8322cf5e3710.png)
4.打开10001模块的文件夹,复制main目录下的文件夹
![image-20240325110319568](https://img-blog.csdnimg.cn/img_convert/06a6b9ed5c6dea22d85d5d92d61b8528.png)
5.打开10002模块的文件夹,将刚才复制的内容粘贴到main目录下
![image-20240325110432090](https://img-blog.csdnimg.cn/img_convert/15ddf553619581e529c81dca10226406.png)
6.打开idea查看10002模块
![image-20240325110504774](https://img-blog.csdnimg.cn/img_convert/c87fdd2936844cb05d37ba09839f122c.png)
7.将10001模块的pom.xml文件依赖粘贴到10002模块(刷新maven)
8.修改10002模块application.yml 的端口为10002
![image-20240325110914698](https://img-blog.csdnimg.cn/img_convert/f23250f498268dfedfde6aca8ab83e88.png)
9.修改10002和10001模块的主启动类名称
![image-20240325111123386](https://img-blog.csdnimg.cn/img_convert/8e6aeb30b13db9a235df4566b1b154c7.png)
![image-20240325111217623](https://img-blog.csdnimg.cn/img_convert/f2ead9603fec6c9052235624b53af425.png)
10.启动所有服务进行测试
![image-20240325111814235](https://img-blog.csdnimg.cn/img_convert/bd66f5efe389efce7ea35f62e312788a.png)
![image-20240325111837051](https://img-blog.csdnimg.cn/img_convert/640c6c5d9dcc3b9a5fdfd10238b0e8c4.png)
11.统一10001服务和10002服务的注册名并启动测试
![image-20240325112202015](https://img-blog.csdnimg.cn/img_convert/67625643d7953dbe3b8a1114365afd9a.png)
![image-20240325112449215](https://img-blog.csdnimg.cn/img_convert/9601a01c8338ef346fca356ba1d263ac.png)
6.服务消费方(81模块)使用Eureka服务集群
1.示意图
![image-20240325113458875](https://img-blog.csdnimg.cn/img_convert/69c5b45a83391fdfdf3a5803534b6f8c.png)
2.修改com/sun/springcloud/controller/MemberConsumerController.java 的前缀为服务提供者在Eureka服务端的key
![image-20240325114305189](https://img-blog.csdnimg.cn/img_convert/f7d1db402180036c71798ef2ef4b8692.png)
3.修改com/sun/springcloud/config/CustomizationBean.java 增加调用时负载均衡注解
![image-20240325114427297](https://img-blog.csdnimg.cn/img_convert/7ce24ed596d87665a710ef45fe6c9f0e.png)
4.修改两个服务提供方的信息,以便区分
member-service-provider-10001
![image-20240325124911816](https://img-blog.csdnimg.cn/img_convert/1ea18ae12de3eeda6aa57e41a8f16ccf.png)
member-service-provider-10002
![image-20240325124844086](https://img-blog.csdnimg.cn/img_convert/6962ccf5ccf44a103576f8dad6a549d4.png)
5.启动测试
1.启动全部服务
![image-20240325125405549](https://img-blog.csdnimg.cn/img_convert/c9d3381339f364d36c61f782daf98a15.png)
2.查看注册情况
![image-20240325130512344](https://img-blog.csdnimg.cn/img_convert/5c26515eaef7c63aee00632a52f7738f.png)
![image-20240325130429387](https://img-blog.csdnimg.cn/img_convert/9401ac971ff6bc00ea90d523ffe04c78.png)
3.postman测试两个服务提供方是否正常
member-service-provider-10001
![image-20240325125737294](https://img-blog.csdnimg.cn/img_convert/291901526470cf14a89aa2bb416a07e9.png)
member-service-provider-10002
![image-20240325125810014](https://img-blog.csdnimg.cn/img_convert/93cc8830c325345a22588fb86176b67a.png)
4.发送请求到服务提供方 member-service-consumer-81
1.第一次请求
![image-20240325130122813](https://img-blog.csdnimg.cn/img_convert/f4cec4ef3f7fc199be98f4f4fa214330.png)
2.第二次请求
![image-20240325130138782](https://img-blog.csdnimg.cn/img_convert/8bb15297f084c2e2eb339cc3cbfe8638.png)
7.DiscoveryClient获取服务注册信息
1.示意图
![image-20240325130929440](https://img-blog.csdnimg.cn/img_convert/6377bc0342f36bff645299a4163c094e.png)
2.需求分析
![image-20240325131114680](https://img-blog.csdnimg.cn/img_convert/1f8fda0b1b0ca0f842ae7b6a9bc3187e.png)
3.代码实现
1.com/sun/springcloud/controller/MemberConsumerController.java 服务消费者调用DiscoveryClient
1.以接口的形式注入DiscoveryClient
![image-20240325133621497](https://img-blog.csdnimg.cn/img_convert/c55f36c23133cc753b97478b782f83fd.png)
2.编写一个接口完成服务发现
@GetMapping("/member/consumer/discovery")
public Object discovery() {
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info("服务名小写={}", service);
List<ServiceInstance> instances = discoveryClient.getInstances(service);
for (ServiceInstance instance : instances) {
log.info("id={}, host={}, port={}, uri={}", service, instance.getHost(), instance.getPort(), instance.getUri());
}
}
return services;
}
3.在启动类使用@EnableDiscoveryClient启动服务发现
![image-20240325133726850](https://img-blog.csdnimg.cn/img_convert/9eea0e5c0b1cbe859b7770befc496f84.png)
4.启动所有服务进行测试
![image-20240325133941011](https://img-blog.csdnimg.cn/img_convert/b3d597c248692a83e1a4bb08bed2da35.png)
![image-20240325133951854](https://img-blog.csdnimg.cn/img_convert/12131b2ad9b5efe2b8f4ccf56e315428.png)
5.注意事项
![image-20240325134044146](https://img-blog.csdnimg.cn/img_convert/7d6582551212df508cf1ef0d7001029b.png)
8.小结
1.项目完整文件目录
![image-20240325135428407](https://img-blog.csdnimg.cn/img_convert/3faea6e295dc646240593e5be345792d.png)
2.项目架构图
![image-20240325135933635](https://img-blog.csdnimg.cn/img_convert/e12e092417f25f83e947e37c6dc19633.png)