springcloud-eureka光速入门
4.1.4.1 在order模块创建 resttemplate对象
🎈边走、边悟🎈迟早会好 |
eureka 是 netflix 开源的一个服务注册和发现工具,主要用于构建分布式系统中的服务发现机制。它在 spring cloud 生态系统中广泛使用,尤其在微服务架构中扮演重要角色。
一、eureka 主要组件
-
eureka server:
- 作为服务注册中心,负责管理服务实例的注册和心跳检测。
- 服务实例在启动时向 eureka server 注册,并定期发送心跳以保持注册信息的有效性。
- eureka server 通常部署为集群,确保高可用性和容错性。
-
eureka client:
- 是注册在 eureka server 上的服务实例。
- 它可以是任何类型的微服务应用程序,在启动时向 eureka server 注册并定期发送心跳。
- eureka client 也可以从 eureka server 获取其他已注册服务的信息,以实现服务间的调用和负载均衡。
二、工作流程
-
服务注册:
- 服务实例在启动时向 eureka server 注册其自身的元数据信息,如 ip 地址、端口号、服务名称等。
-
服务心跳:
- 注册后,服务实例定期向 eureka server 发送心跳请求,以表明其仍然活跃。若在一段时间内未收到心跳,eureka server 将认为该实例已失效,并将其从注册列表中移除。
-
服务发现:
- 服务调用者(客户端)通过 eureka server 查询可用的服务实例列表,以实现服务调用。
- eureka client 缓存这些信息,并定期从 eureka server 更新,确保负载均衡和高可用性。
-
负载均衡:
- 客户端根据从 eureka server 获取的服务实例列表,实现客户端负载均衡。
- 常见的负载均衡策略包括轮询、随机选择、加权轮询等。
三、优势
- 高可用性: eureka server 支持集群部署,确保在某些节点故障时系统仍然可用。
- 自我保护机制: 当 eureka server 检测到大量客户端失效时,进入自我保护模式,避免因网络分区等原因误判服务失效。
- 易扩展性: 新的服务实例可以动态注册和发现,支持弹性扩展。
eureka 在 netflix 的微服务架构中得到了广泛应用,并成为 spring cloud 的核心组件之一,用于实现服务注册与发现。
四、eureka-光速入门【重点
】
4.1 案例准备
4.1.1 创建父工程 tingyi-shop
pom.xml
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<packaging>pom</packaging>
<parent>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-parent</artifactid>
<version>2.2.8.release</version>
</parent>
<dependencymanagement>
<dependencies>
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-dependencies</artifactid>
<!-- 版本号是按照伦敦地铁站的名字命名的 -->
<version>hoxton.sr4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencymanagement>
4.1.2 创建子工程 tingyi-goods
pom.xml
<dependencies>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
</dependencies>
引导类
@springbootapplication
public class goodsapplication {
public static void main(string[] args) {
springapplication.run(goodsapplication.class, args);
}
}
application.yml
server:
port: 9001
#指定服务的名称
spring:
application:
name: tingyi-goods
controller编写
@restcontroller
public class goodscontroller {
@requestmapping("/query")
public string query() {
return "查询商品信息!";
}
}
启动并查看效果
4.1.3 创建子工程 tingyi-order
pom.xml
<dependencies>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
</dependencies>
引导类
@springbootapplication
public class orderapplication {
public static void main(string[] args) {
springapplication.run(orderapplication.class,args);
}
}
application.yml
server:
port: 9002
#指定服务的名称
spring:
application:
name: tingyi-order
编写controller
@restcontroller
public class ordercontroller {
@requestmapping("/query")
public string query(){
return "查询订单";
}
}
启动并查看效果
4.1.4 案例调整
在查询订单时,同时也需要获取商品的信息,那么我们如何查询商品信息呢?
我们可以通过spring为我们提供的resttemplate 模板对象 远程调用商品模块中的 控制器。
4.1.4.1 在order模块创建 resttemplate对象
@configuration
public class resttemplateconfig {
@bean
public resttemplate resttemplate(clienthttprequestfactory factory) {
return new resttemplate(factory);
}
@bean
public clienthttprequestfactory simpleclienthttprequestfactory() {
simpleclienthttprequestfactory factory = new simpleclienthttprequestfactory();
factory.setreadtimeout(5000);//ms
factory.setconnecttimeout(15000);//ms
return factory;
}
}
4.1.4.2 修改ordercontroller
4.1.4.2 重启并测试
4.2 为什么使用eureka
eureka |
---|
4.2 eureka光速入门
4.2.1 创建eurekaserver
<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>
</dependencies>
@springbootapplication
@enableeurekaserver
public class eurekaapplication {
public static void main(string[] args) {
springapplication.run(eurekaapplication.class,args);
}
}
server:
port: 8761 # 端口号
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost # localhost
client:
# 表示是否将自己注册到eureka server,默认为true
registerwitheureka: false
# 表示是否从eureka server获取注册信息,默认为true。
# 因为这是一个单点的eureka server,不需要同步其他的eureka server节点的数据,故而设为false
fetchregistry: false
# 设置与eureka server交互的地址,查询服务和注册服务都需要依赖这个地址
serviceurl:
defaultzone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动 eurekaserver并访问
4.2.2 调整商品模块
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
<version>2.2.2.release</version>
</dependency>
@springbootapplication
@enableeurekaclient
public class goodsapplication {
public static void main(string[] args) {
springapplication.run(goodsapplication.class,args);
}
}
# 指定eureka服务地址
eureka:
client:
service-url:
defaultzone: http://localhost:8761/eureka
# eureka服务中, 显示的当前search业务微服务的访问地址.
instance:
home-page-url: http://localhost:${server.port}
4.2.3 调整订单模块
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
<version>2.2.2.release</version>
</dependency>
@springbootapplication
@enableeurekaclient
public class orderapplication {
public static void main(string[] args) {
springapplication.run(orderapplication.class,args);
}
}
# 指定eureka服务地址
eureka:
client:
service-url:
defaultzone: http://localhost:8761/eureka
4.2.4 调整订单模块, 调用商品模块
@restcontroller
public class ordercontroller {
@autowired
eurekaclient eurekaclient;
//自动注入resttemplate对象
@autowired
resttemplate template;
@requestmapping("/query")
public string query(){
//根据eureka上注册的服务名称获取实例对象
instanceinfo instanceinfo = eurekaclient.getnextserverfromeureka("tingyi-goods", false);
//获取对应模块的url
string url = instanceinfo.gethomepageurl();
responseentity<string> responseentity = template.getforentity(url + "/query", string.class);
//返回结果
return "查询订单" + "&" + responseentity.getbody();
}
}
4.2.4 测试
4.3 eureka的安全性
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-security</artifactid>
</dependency>
package com.tingyi.config;
import org.springframework.security.config.annotation.web.builders.httpsecurity;
import org.springframework.security.config.annotation.web.configuration.enablewebsecurity;
import org.springframework.security.config.annotation.web.configuration.websecurityconfigureradapter;
/**
* @author tingyi
*/
@enablewebsecurity
public class websecurityconfig extends websecurityconfigureradapter {
@override
protected void configure(httpsecurity http) throws exception {
// 忽略掉/eureka/**
http.csrf().ignoringantmatchers("/eureka/**");
super.configure(http);
}
}
server:
port: 8761 # 端口号
spring:
application:
name: eureka-server
# 指定eureka的用户名和密码
security:
user:
name: root
password: root
eureka:
instance:
hostname: localhost # localhost
client:
# 表示是否将自己注册到eureka server,默认为true
registerwitheureka: false
# 表示是否从eureka server获取注册信息,默认为true。
# 因为这是一个单点的eureka server,不需要同步其他的eureka server节点的数据,故而设为false
fetchregistry: false
# 设置与eureka server交互的地址,查询服务和注册服务都需要依赖这个地址
serviceurl:
defaultzone: http://${eureka.instance.hostname}:${server.port}/eureka/
eureka:
client:
service-url:
defaultzone: http://用户名:密码@localhost:8761/eureka
4.4 eureka的高可用
4.4.1 配置以及代码
server:
port: 9001
#指定服务的名称
spring:
application:
name: tingyi-order
# 指定eureka服务地址
eureka:
client:
service-url:
defaultzone: http://root:root@eureka-server1:8761/eureka,http://root:root@eureka-server2:8762/eureka
server:
port: 9002
#指定服务的名称
spring:
application:
name: tingyi-goods
# 指定eureka服务地址
eureka:
client:
service-url:
defaultzone: http://root:root@eureka-server1:8761/eureka,http://root:root@eureka-server2:8762/eureka
server:
port: 8761 # 端口号
spring:
application:
name: eureka-server
security:
user:
name: root
password: root
eureka:
instance:
hostname: localhost # localhost
client:
# 表示是否将自己注册到eureka server,默认为true
registerwitheureka: true
# 表示是否从eureka server获取注册信息,默认为true。
fetchregistry: true
# 设置与eureka server交互的地址,查询服务和注册服务都需要依赖这个地址
serviceurl:
defaultzone: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka/
# eureka自我保护机制关闭, 当开启自我保护机制开启后,实例不会删除,
# 导致部分请求会连接不存在的实例,客户端没有做重试或者熔断的话会出大量问题
server:
enable-self-preservation: false
配置域名(只是用来欺骗自己的电脑)
4.4.2 测试
演示eureka集群
-
先将 多个tingyi
_eureka
微服务启动 -
登录后,可以在任意管理页看到集群信息
4.4.3 eureka的细节
eureka:
instance:
lease-renewal-interval-in-seconds: 30 #心跳的间隔
lease-expiration-duration-in-seconds: 90 # 多久没发送,就认为你宕机了
eureka:
client:
registry-fetch-interval-seconds: 30 # 每隔多久去更新一下本地的注册表缓存信息
eureka:
server:
enable-self-preservation: true # 开启自我保护机制, 建议开发阶段设置为false, 不然服务停了, eureka中的信息还在.
🎈众口难调🎈从心就好 |
发表评论