网站建设企业的市场分析,腾讯云建wordpress,慧拓客电销系统,渭南市住房和城乡建设部网站Eureka
Eureka是Netflix开源的一个用于构建基于微服务架构的服务发现和注册中心技术。在微服务架构中#xff0c;系统被拆分成多个小型、自治的服务#xff0c;每个服务负责特定的业务功能。这些服务需要能够相互发现和通信#xff0c;这就是Eureka所提供的功能。
Eureka主…Eureka
Eureka是Netflix开源的一个用于构建基于微服务架构的服务发现和注册中心技术。在微服务架构中系统被拆分成多个小型、自治的服务每个服务负责特定的业务功能。这些服务需要能够相互发现和通信这就是Eureka所提供的功能。
Eureka主要包括两个角色Eureka Server和Eureka Client。
Eureka Server
Eureka Server是一个服务注册中心用于管理和维护所有微服务的注册信息。每个微服务在启动时会向Eureka Server注册自己的信息包括服务名称、IP地址、端口等。Eureka Server维护了一个服务注册表记录了所有已注册的微服务以及它们的相关信息。其他微服务可以通过向Eureka Server发送请求来发现其他可用的微服务。
Eureka Client
Eureka Client是各个微服务的客户端用于注册自己以及发现其他微服务。当微服务启动时它会注册到Eureka Server同时定期向Eureka Server发送心跳以保持注册信息的更新。Eureka Client还能从Eureka Server获取其他微服务的信息从而实现了服务之间的发现与通信。
Eureka优势
动态发现和注册微服务架构中服务的部署和扩展很频繁使用Eureka可以实现动态注册和发现微服务使得新加入或移除的服务能够自动被其他服务感知无需手动配置。
高可用性Eureka支持多个Eureka Server之间的相互注册和复制以实现高可用性。如果一个Eureka Server发生故障其他Eureka Server仍然能够提供服务发现的功能。
负载均衡Eureka Client可以根据服务的负载情况进行负载均衡选择合适的实例进行请求转发。
自我保护机制Eureka具备自我保护机制当某个时刻注册中心出现网络分区故障或者注册信息不稳定时Eureka会保护已注册的服务实例不会将其剔除确保整体系统的稳定性。
总之Eureka技术为微服务架构提供了方便的服务发现和注册能力帮助构建高效、弹性、可扩展的分布式系统。虽然Netflix已经宣布停止维护Eureka但它的基本概念和思想仍然被广泛应用于各种微服务架构中。
为什么要引入Eureka来动态发现和注册
现代企业开发一般要求利用微服务去对业务进行治理例如公司有两个服务分别是user服务和order服务同时这两个服务会对应两个独立的数据库user和order。由于这两个数据库对于对方来说相互独立我想进行两个库之间的关联查询是不可能的。 这时可以利用远程调用的方法解决这个问题
spring 提供了RestTemplate来支持实现远程调用可以在配置类文件中进行RestTemplate restTemplate的Bean注册。
我们这里在order-service的OrederApplication中注册RestTemplate
SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}// 创建RestTemplate注入Spring容器BeanLoadBalanced // 引入负载均衡的注解public RestTemplate restTemplate(){return new RestTemplate();}
}修改order-service中的OrderService来获取user对象其中http://localhost:8081/user/{id}用户查询地址利用restTemplate.getForObject请求是get就用get请求是post就用postForObject就行向http://localhost:8081/user/{id}服务查询需要的user对象。 返回的对象一般来说是JSON类型所以restTemplate可以自动进行类型转换第二个参数User.class告诉restTemplate返回的类型。 至此我们就通过RestTemplate进行跨数据的方法。
Service
public class OrderService {Autowiredprivate OrderMapper orderMapper;Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order orderMapper.findById(orderId);// 2.利用RestTemplate发起http请求来查询用户System.out.println(order);String url http://localhost:8081/userorder.getUserId();User user restTemplate.getForObject(url, User.class);// 封装对象order.setUser(user);// 4.返回return order;}
}但是上面请求最大的问题就是我给的路径是固定的一般而言大规模开发的过程中不会在代码中给出明确的路径因为port变更是经常发生的。
为此我们就需要引入Eureka服务器。
Eureka服务
创建Eureka微服务
注册中心服务端eureka-server这必须是一个独立的微服务。 为该服务引入依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId/dependency编写启动类:给eureka-server服务编写一个启动类一定要添加一个EnableEurekaServer注解开启eureka的注册中心功能
package com....;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;SpringBootApplication
EnableEurekaServer
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}编写配置文件:编写一个application.yml文件内容如下
server:port: 10086 # 服务地址
spring:application:name: eureka-server # 2. 微服务的名称
eureka:client:service-url: # 3. 服务地址信息尤里卡自己也是一个微服务会将自己也注册到地址上为了尤里卡集群通信defaultZone: http://127.0.0.1:10086/eureka启动微服务然后在浏览器访问http://127.0.0.1:10086 服务注册
下面我们将user-service注册到eureka-server中去。
1引入依赖:在user-service的pom文件中引入下面的eureka-client依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId
/dependency2配置文件:在user-service中修改application.yml文件添加服务名称、eureka地址
spring:application:name: userservice
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka同样的方法在order-service中也能注册注册后重启服务可以看到三个应用都出现在列表上了 order服务拉取就可以进行修改,吧原来固定的url改成动态的微服务名称即可 http://user-server/user/ Service
public class OrderService {Autowiredprivate OrderMapper orderMapper;Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order orderMapper.findById(orderId);// 2.利用RestTemplate发起http请求来查询用户System.out.println(order);String url http://user-server/user/order.getUserId();User user restTemplate.getForObject(url, User.class);// 封装对象order.setUser(user);// 4.返回return order;}
}