概述
文章目录
- 1、Eureka简介
- 1、什么是服务治理
- 2、什么是服务注册与发现
- 3、Eureka两个组件
- 2、Eureka注册中心搭建
- 1、pom.xml
- 2、编写主配置文件
- 3、编写主启动类
- 4、启动、测试
- 3、向Eureka中注册服务
- 1、pom.xml
- 2、主配置文件
- 3、主启动类
- 4、启动、测试
- 4、Eureka集群
- 1、为什么要使用集群?
- 2、如何搭建Eureka集群?
- 1、修改原注册中心(7001)的主配置文件
- 2、完全复制7001创建7002模块
- 3、运行7001和7002服务
- 3、客户端对Eureka集群的适配
- 4、测试运行注意
- 5、客户端(服务提供者)集群
- 1、显示服务提供者端口号
- 2、负载均衡
- 6、功能完善
- 1、Actuator
- 服务名修改及显示服务ip地址
- 2、服务发现Discovery
- 3、Eureka自我保护机制
1、Eureka简介
1、什么是服务治理
当服务提供方和服务消费方增多之后,就需要一个服务中心去协调管理各服务间的依赖关系
2、什么是服务注册与发现
3、Eureka两个组件
- Eureka Server:类似于工业园区内部的物业公司,管理其他入驻进来的公司
- Eureka Client:类似于工业园区内部入驻的公司(如:尚硅谷)、或者是需要使用其他模块提供的服务的人(如:在尚硅谷上学的学生)
- 公司要想入驻工业园区,对外提供服务,首先需要向物业公司注册办理入驻,之后才能在该工业园区向外提供服务
2、Eureka注册中心搭建
1、pom.xml
<?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>spring-cloud</artifactId>
<groupId>indi.zhihuali</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-server-7001</artifactId>
<dependencies>
<!--eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>indi.zhihuali</groupId>
<artifactId>api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</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.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
</project>
2、编写主配置文件
# 单注册中心配置
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务器实例名
client:
register-with-eureka: false #注册中心不注册自己
fetch-registry: false #自己端就是注册中心,维护服务实例,不需要自己去检索服务
service-url:
# 设置与 Eureka Server交互的地址查询服务和注册服务都需要依赖该地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
3、编写主启动类
使用@EnableEurekaServer
标记Eureka服务端
package indi.zhihuali;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //标记本模块是Eureka服务端
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class, args);
}
}
4、启动、测试
页面访问localhost:7001
即可看到Spring Eureka页面
3、向Eureka中注册服务
将支付模块(Eureka Client、服务提供者)注册进Eureka(Eureka Server),在订单模块(Eureka Client、服务消费者)使用支付模块时通过Eureka进行调用
因此此处为了将支付模块注册进Eureka中,需要修改模块中的一些配置
本例中只写出支付模块的注册,其他模块与支付模块基本类似
1、pom.xml
向支付模块添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--注意别导错包,有一个名字里面不带starter的包-->
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、主配置文件
spring:
application:
name: payment-service #注册使用的服务名
eureka:
client:
register-with-eureka: true #将自己注册进Eureka
fetch-registry: true # 从Eureka中抓取已有的注册信息,当集群部署时必须设置为true以配合ribbon实现负载均衡
service-url:
defaultZone: http://localhost:7001/eureka #单机版
3、主启动类
在主启动类上添加注解@EnableEurekaClient
4、启动、测试
先开启Eureka服务端,再开启要注册进Eureka的客户端
页面访问localhost:7001
即可看到Spring Eureka页面,此时已经存在了注册进去的服务了
4、Eureka集群
1、为什么要使用集群?
为了保证Eureka的高可用,需要搭建集群
解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错
集群内部多个注册中心相互注册、相互守望
2、如何搭建Eureka集群?
1、修改原注册中心(7001)的主配置文件
由于是集群部署,因此Eureka的服务实例不能单一地写为localhost
- 可以通过修改本地
C:WindowsSystem32driversetchost
文件,通过添加映射名来达到localhost的多个别名
## 单注册中心配置
#server:
# port: 7001
#eureka:
# instance:
# hostname: localhost #eureka服务器实例名
# client:
# register-with-eureka: false #注册中心不注册自己
# fetch-registry: false #自己端就是注册中心,维护服务实例,不需要自己去检索服务
# service-url:
# # 设置与 Eureka Server交互的地址查询服务和注册服务都需要依赖该地址
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
# 集群部署
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka7002.com:7002/eureka #多个注册中心间相互注册、相互守望,7001去7002中进行注册
2、完全复制7001创建7002模块
3、运行7001和7002服务
3、客户端对Eureka集群的适配
修改支付模块和订单模块的主配置文件保证客户端在集群中各个注册中心都注册到
- 修改主配置文件
eureka:
client:
register-with-eureka: true #将自己注册进Eureka
fetch-registry: true # 从Eureka中抓取已有的注册信息,当集群部署时必须设置为true以配合ribbon实现负载均衡
service-url:
# defaultZone: http://localhost:7001/eureka #单机版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
4、测试运行注意
当启动服务时,启动顺序为:注册中心 (集群)- > 服务提供者(集群) -> 服务消费者
5、客户端(服务提供者)集群
- 将支付模块8001复制一份生成8002
需要解决的问题: - 提供服务时需要显式指明是谁提供的服务
- 负载均衡
1、显示服务提供者端口号
- 支付模块(8001、8002)需要在Controller中指定自己的服务端口号,有利于查看具体是哪台机器提供了服务;同时也可以对之后Eureka自动实现的负载均衡功能进行监测
2、负载均衡
订单模块在向注册中心申请支付模块服务时,由于8001和8002对外暴露的名字相同,因此在原本的订单模块中的OrderController
类中不能显式指定端口号(会导致只会走某一个提供者的服务),而是需要修改restTemplate
的请求路径为服务名,Eureaka会自动进行负载均衡实现高可用
- 修改源代码中固定的端口号
- 为RestTemplate开启负载均衡,默认轮询
package indi.zhihuali.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @ program: spring-cloud
* @ description:
* @ author: zhihua li
* @ create: 2021-09-02 09:52
**/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //赋予 restTemplate负载均衡能力,默认采用轮询机制
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
至此,负载均衡功能实现
6、功能完善
1、Actuator
服务名修改及显示服务ip地址
- 服务名应该是公共的,而不局限于某个主机下
- 当鼠标悬浮于某一服务上时,应该在左下角显示对应的ip地址及端口号
修改步骤:
以8001.yaml为例
eureka:
client:
register-with-eureka: true #将自己注册进Eureka
fetch-registry: true # 从Eureka中抓取已有的注册信息,当集群部署时必须设置为true以配合ribbon实现负载均衡
service-url:
# defaultZone: http://localhost:7001/eureka #单机版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
instance:
#屏蔽主机名称
instance-id: payment8001
#显示ip服务地址
prefer-ip-address: true
2、服务发现Discovery
如何查看当前注册入Eureka中的服务及其对应的信息呢?
以8001为例:
@GetMapping("/discovery")
public Object discovery() {
// 显示所有服务名称
List<String> services = discoveryClient.getServices();
for (String each : services) {
log.info("-----" + each);
// -----payment-service
// -----order-service
}
// 显示名为PAYMENT-SERVICE的所有实例信息
List<ServiceInstance> instances = discoveryClient.getInstances("PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId() + "t" + instance.getHost()
+ "t" + instance.getPort() + "t" + instance.getUri());
//PAYMENT-SERVICE 192.168.146.1 8002 http://192.168.146.1:8002
//PAYMENT-SERVICE 192.168.146.1 8001 http://192.168.146.1:8001
}
return discoveryClient;
}
在8001对应的主启动类上添加@EnableDiscoveryClient
开启服务发现功能
通过访问定义的discovery接口,可以看到上面代码定义时注释部分的值
3、Eureka自我保护机制
- 什么是自我保护?为什么会出现自我保护?
默认情况下,Eureka的自我保护机制是开启的,也通常不会去禁用掉自我保护机制
如果要禁用,可以通过配置eureka.server.enable-self-preservation = false
进行禁用
最后
以上就是缓慢银耳汤为你收集整理的【SpringCloud-03】Eureka的全部内容,希望文章能够帮你解决【SpringCloud-03】Eureka所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复