WordPress 代码建站,网站开发技术协议,手机制作表白网站,wordpress api文档简介
Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理
在传统的RPC远程调用框架中#xff0c;管理每个服务与服务之间依赖关系比较复杂#xff0c;管理比较复杂#xff0c;所以需要使用服务治理#xff0c;管理服务于服务之间依赖关系#xff0c;可以实现…简介
Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理
在传统的RPC远程调用框架中管理每个服务与服务之间依赖关系比较复杂管理比较复杂所以需要使用服务治理管理服务于服务之间依赖关系可以实现服务调用、负载均衡、容错等实现服务发现与注册。
Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后会在EurekaServer中进行注册这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息服务节点的信息可以在界面中直观看到。
EurekaClient通过注册中心进行访问
它是一个Java客户端用于简化Eureka Server的交互客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳EurekaServer将会从服务注册表中把这个服务节点移除默认90秒)
Eureka Server 服务注册发现中心
pom文件
dependencies!--eureka-server--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId/dependency!--boot web actuator--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!--一般通用配置--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactId/dependency/dependenciesapplication.yml:
server:port: 7001eureka:instance:hostname: locathost #eureka服务端的实例名称client:#false表示不向注册中心注册自己。register-with-eureka: false#false表示自己端就是注册中心我的职责就是维护服务实例并不需要去检索服务fetch-registry: falseservice-url:#设置与Eureka server交互的地址查询服务和注册服务都需要依赖这个地址。defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动类需要在上面加入EnableEurekaServer
SpringBootApplication
EnableEurekaServer
public class EurekaMain7001 {public static void main(String[] args) {SpringApplication.run(EurekaMain7001.class,args);}
}完成后启动浏览器访问 localhost:7001如果访问到如下界面则启动成功。
Eureka Client服务提供者、服务消费者
pom文件加入
!--eureka-client--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId
/dependencyapplication.yml文件中加入
eureka:client:#表示是否将自己注册进Eurekaserver默认为true。register-with-eureka: true#是否从EurekaServer抓取已有的注册信息默认为true。单节点无所谓集群必须设置为true才能配合ribbon使用负载均衡fetchRegistry: trueservice-url:defaultZone: http://localhost:7001/eureka在启动类上加入EnableEurekaClient注解
Eureka集群部署
多Eureka Server
创建两个不同的Eureka Server7001、7002
7001在application中配置 url 7001指向70027002指向7001.
server:port: 7001eureka:instance:hostname: eureka7001 #eureka服务端的实例名称client:#false表示不向注册中心注册自己。register-with-eureka: false#false表示自己端就是注册中心我的职责就是维护服务实例并不需要去检索服务fetch-registry: falseservice-url:#设置与Eureka server交互的地址查询服务和注册服务都需要依赖这个地址。defaultZone: http://localhost:7002/eureka/
7002配置同理。 将消费者、服务者的application.yml中的url改为两个Eureka Server的地址 service-url:defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka多服务提供者provider
创建新的provider程序修改application中的端口号为不同的端口服务名相同。 在Eureka管理界面上可以看到存在两个服务提供者。 接着更改服务消费者的代码通过服务名作为网址来调用服务。 修改url
public static final String PAYMENT_URLhttp://CLOUD-PAYMENT-SERVICE;//这里之前是localhost!!GetMapping(/consumer/payment/create)public CommonResultPayment create(Payment payment){return restTemplate.postForObject(PAYMENT_URL/payment/create,payment, CommonResult.class);}GetMapping(/consumer/payment/get/{id})public CommonResultPayment getPayment(PathVariable Long id){return restTemplate.getForObject(PAYMENT_URL/payment/get/id, CommonResult.class);}在RestTemplate配置类中声明负载平衡注解
Configuration
public class ApplicationContextConfig {BeanLoadBalancedRestTemplate getRestTemplate(){return new RestTemplate();}
}服务发现
在启动类上加入注解EnableDiscoveryClient即可通过DiscoveryClient获取位于Eureka注册中心的服务名以及服务名对应的相关信息如IP端口。 Resourceprivate DiscoveryClient discoveryClient;GetMapping(/payment/discovery)public Object discovery(){//获取所有服务名ListString services discoveryClient.getServices();for(String service:services){System.out.println(service);}//获取提供指定服务的所有提供者ListServiceInstance instances discoveryClient.getInstances(CLOUD-PAYMENT-SERVICE);instances.stream().forEach((instance-{System.out.println(instance.getServiceId() instance.getHost():instance.getPort());}));return this.discoveryClient;}保护模式
在Eureka服务端90s内丢失了大量的心跳包大量服务失联会进入保护模式不再注销服务实例。