专题网站建设解决方案,大数据培训机构排名前十,手机网站登陆模板,门户网站的特点和优势文章目录 前言角色#xff08;三个#xff09; 工程说明基础运行环境工程目录说明启动顺序#xff08;建议#xff09;#xff1a;运行效果注册与发现中心服务消费者#xff1a; 代码说明服务注册中心#xff08;Register Service#xff09;服务提供者#xff08;Pro… 文章目录 前言角色三个 工程说明基础运行环境工程目录说明启动顺序建议运行效果注册与发现中心服务消费者 代码说明服务注册中心Register Service服务提供者Provider Service服务消费者Consumer Service服务提供者SDKProvider Service sdk 负载均衡源码地址 前言
略
角色三个
服务注册中心Register Service Eureka Server提供注册和发现功能服务提供者Provider ServiceEureka Client将自己提供的服务注册到服务注册中心以供服务消费者发现和调用服务消费者Consumer ServiceEureka Client从服务注册中心获取服务列表
工程说明
基础运行环境 JDK: jdk-20.0.2spring cloud: 2022.0.4spring boot: 3.1.5工程目录说明
demo-springcloud-netflix-eureka 父工程
├── demo-springcloud-netflix-eureka-consumer 服务消费者端口8000
├── demo-springcloud-netflix-eureka-provider-impl1 服务提供者端口9001
├── demo-springcloud-netflix-eureka-provider-impl2服务提供者端口9002
├── demo-springcloud-netflix-eureka-provider-sdk服务端SDK
├── demo-springcloud-netflix-eureka-register1服务注册中心端口7001
└── demo-springcloud-netflix-eureka-register2服务注册中心端口7002注意 示例中为了方便看效果服务注册中心和服务提供者分别提供两个工程内部代码都一样只是端口不同。
启动顺序建议
demo-springcloud-netflix-eureka-register1
demo-springcloud-netflix-eureka-register2
demo-springcloud-netflix-eureka-provider-impl1
demo-springcloud-netflix-eureka-provider-impl2
demo-springcloud-netflix-eureka-consumer运行效果
注册与发现中心
http://localhost:7001 或 http://localhost:7002 服务消费者
访问这个地址将随机返回结果http://localhost:8000/main2?nameabc123
hello: abc123, Im 9001hello: abc123, Im 9002代码说明
服务注册中心Register Service
demo-springcloud-netflix-eureka-register1端口7001
关键依赖pom.xml
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-server/artifactId
/dependency关键配置application.properties
spring.application.namedemo-springcloud-netflix-eureka-register
server.port7001eureka.instance.hostname${spring.application.name}
eureka.instance.instance-id${spring.application.name}:${server.port}
eureka.instance.prefer-ip-addresstrue# 是否将自己注册到Eureka-Register中默认的为true单机设置为false集群设置为true
eureka.client.register-with-eurekatrue# 是否从Eureka-Register中获取服务注册信息默认为true
eureka.client.fetch-registryfalse# 这里是配置
eureka.client.service-url.defaultZonehttp://localhost:7001/eureka/,http://localhost:7002/eureka/# 测试时关闭自我保护机制保证不可用服务及时踢出
eureka.server.enable-self-preservationfalse启动类
SpringBootApplication
EnableEurekaServer
public class SpringCloudNetflixEurekaRegister1 {public static void main(String[] args) {SpringApplication.run(SpringCloudNetflixEurekaRegister1.class, args);}
}demo-springcloud-netflix-eureka-register2端口7002 与demo-springcloud-netflix-eureka-register1代码完全一样只是application.properties中的server.port7002
spring.application.namedemo-springcloud-netflix-eureka-register
server.port7002
....服务提供者Provider Service
demo-springcloud-netflix-eureka-provider-impl1端口9001
关键依赖pom.xml
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId
/dependency关键配置application.properties
spring.application.namedemo-springcloud-netflix-eureka-provider
server.port9001eureka.instance.instance-id${spring.application.name}:${server.port}
eureka.instance.prefer-ip-addresstrue# 每间隔2s向服务端发送一次心跳证明自己依然”存活“
eureka.instance.lease-renewal-interval-in-seconds2# 告诉服务端如果我10s之内没有给你发心跳就代表我“死”了将我踢出掉。
eureka.instance.lease-expiration-duration-in-seconds10# 是否将自己注册到Eureka-Register中默认的为true
eureka.client.register-with-eurekatrue# 是否从Eureka-Server中获取服务注册信息默认为true
eureka.client.fetch-registrytrue
eureka.client.service-url.defaultZonehttp://localhost:7001/eureka/,http://localhost:7002/eureka/启动类
SpringBootApplication
EnableDiscoveryClient
public class SpringcloudNetflixEurekaProvider1 {public static void main(String[] args) {SpringApplication.run(SpringcloudNetflixEurekaProvider1.class, args);}
}demo-springcloud-netflix-eureka-provider2端口9002 与demo-springcloud-netflix-eureka-provider1代码完全一样只是application.properties中的server.port9002
spring.application.namedemo-springcloud-netflix-eureka-provider
server.port9002
....服务消费者Consumer Service
demo-springcloud-netflix-eureka-consumer端口8000
关键依赖pom.xml
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId
/dependency关键配置application.properties
spring.application.namedemo-springcloud-netflix-eureka-consumer
server.port8000eureka.instance.instance-id${spring.application.name}:${server.port}
eureka.instance.prefer-ip-addresstrue
eureka.instance.app-group-namedemo-springcloud-eureka-client-a
eureka.instance.lease-renewal-interval-in-seconds2# 是否将自己注册到Eureka-Server中默认的为true这里设置为false表示不注册不希望被别的服务发现
eureka.client.register-with-eurekafalse
eureka.client.registry-fetch-interval-seconds2# 是否从Eureka-Server中获取服务注册信息默认为true
eureka.client.fetch-registrytrue
eureka.client.service-url.defaultZonehttp://localhost:7001/eureka/,http://localhost:7002/eureka/启动类
SpringBootApplication
EnableDiscoveryClient
public class SpringCloudNetflixEurekaConsumer {public static void main(String[] args) {SpringApplication.run(SpringCloudNetflixEurekaConsumer.class, args);}
}服务提供者SDKProvider Service sdk
实际工作中该工程应该由服务提供者开发团队开发供服务消费者依赖调用来实现远程调用。本实例使用openfeign。
关键依赖pom.xml
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId
/dependency关键代码demo-springcloud-netflix-eureka-provider-sdk工程ProviderService类
// 接口无需手写实现类
Component
FeignClient(name ProviderConstants.SERVICE_ID)
public interface ProviderService {// 服务提供者需提供“/sub”接口服务RequestMapping(value /sub)String test(RequestParam(name) String name);// 其他服务....
}服务提供者依赖后使用demo-springcloud-netflix-eureka-provider-impl1工程
Service
public class DemoService implements ProviderService {Autowiredprivate Environment env;public String test(String name) {return hello: name , Im env.getProperty(server.port);}
}Controller
public class DemoController {Autowiredprivate DemoService service;ResponseBodyRequestMapping(/sub)public String test(String name) {return service.test(name);}
}服务消费者依赖后使用demo-springcloud-netflix-eureka-consumer工程 Autowired
private ProviderService providerService;ResponseBody
RequestMapping(/main2)
public String main2(String name) {return providerService.test(name);
}负载均衡
客户端负载demo-springcloud-netflix-eureka-consumer工程
Configuration(proxyBeanMethods false)
public class CustomLoadBalancerConfig {BeanConditionalOnMissingBeanpublic ReactorLoadBalancerServiceInstance reactorServiceInstanceLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {var name ProviderConstants.SERVICE_ID;return new CustomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}// CustomLoadBalancer.javaprivate ResponseServiceInstance getInstanceResponse(ListServiceInstance instances) {if (instances.isEmpty()) {if (log.isWarnEnabled()) {log.warn(No servers available for service: serviceId);}return new EmptyResponse();}// 随机var index ThreadLocalRandom.current().nextInt(instances.size());var instance instances.get(index);return new DefaultResponse(instance);}源码地址
https://gitee.com/xiaojianhx/demo-springcloud-netflix-eureka