Eureka集群原理说明
1,参考单机版Erueka7001,搭建Eureka7002
2,该pom文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3,修改本地映射路径
1,找到C:\Windows\System32\drivers\etc路径下的hosts文件
2,修改映射配置添加进hosts文件
3,添加127.0.0.1 eureka7001.com,127.0.0.1 eureka7002.com
4,修改Eureka7001,7002YML文件(之前是单机,现在配置集群)
7001yml文件
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka7002.com:7002/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
7002yml文件
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka7001.com:7001/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
5,把Eureka7001主启动类上的注解复制到7002上即可启动7002
6,把服务提供者(8001)注册到7001和7002上修改8001yml文件
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
7,把服务消费者(80)注册到Eureka上修改80yml文件
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
8,测试
1,先启动Eureka 7001和7002服务
2,在启动8001
3,启动80
4,访问一个写好的接口http://localhost/consumer/payment/get/31
5,有返回值说明集群搭建成功
9,服务提供者(8001)集群环境搭建,参照8001建立8002
10,修改8002pom文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
11,修改Eureka7001,7002YML
7001yml
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka7002.com:7002/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
7002yml
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka7001.com:7001/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
12 在提供者8001,8002中分别建立一个controller
8001controller
@RestController
@Slf4j
public class PaymentController {
@Resource
private PaymentService paymentService;
@Value("${server.port}")
private String serverPort;
@Resource
private DiscoveryClient discoveryClient;
@PostMapping("/payment/create")
public CommonResult create(@RequestBody Payment payment){
int result = paymentService.create(payment);
log.info("插入结果"+result);
if(result>0){
return new CommonResult(200,"插入结果成功,serverPort: "+serverPort,result);
}else {
return new CommonResult(400,"插入结果失败,serverPort: "+serverPort,null);
}
}
@GetMapping("/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id")Long id){
Payment paymentById = paymentService.getPaymentById(id);
log.info("查询结果"+paymentById);
if(paymentById!=null){
return new CommonResult(400,"查询成功,serverPort: "+serverPort,paymentById);
}else {
return new CommonResult(200,"查询失败,serverPort: "+serverPort,null);
}
}
@GetMapping("/payment/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
for (String element:services){
log.info("++++++++++element"+element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance:instances){
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
@GetMapping(value = "/payment/lb")
public String getPaymentLB(){
return serverPort;
}
@GetMapping(value = "/payment/feign/timeout")
public String paymentFeignTimeout(){
try{
TimeUnit.SECONDS.sleep(3);
}catch (InterruptedException e){
e.printStackTrace();
}
return serverPort;
}
}
8002yml
@RestController
@Slf4j
public class PaymentController {
@Resource
private PaymentService paymentService;
@Value("${server.port}")
private String serverPort;
@Resource
private DiscoveryClient discoveryClient;
@PostMapping("/payment/create")
public CommonResult create(@RequestBody Payment payment){
int result = paymentService.create(payment);
log.info("插入结果"+result);
if(result>0){
return new CommonResult(200,"插入结果成功,serverPort: "+serverPort,result);
}else {
return new CommonResult(400,"插入结果失败,serverPort: "+serverPort,null);
}
}
@GetMapping("/payment/get/{id}")
public CommonResult getPaymentById(@PathVariable("id")Long id){
Payment paymentById = paymentService.getPaymentById(id);
log.info("查询结果"+paymentById);
if(paymentById!=null){
return new CommonResult(400,"查询成功,serverPort: "+serverPort,paymentById);
}else {
return new CommonResult(200,"查询失败,serverPort: "+serverPort,null);
}
}
@GetMapping("/payment/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
for (String element:services){
log.info("++++++++++element"+element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance:instances){
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
@GetMapping(value = "/payment/lb")
public String getPaymentLB(){
return serverPort;
}
@GetMapping(value = "/payment/feign/timeout")
public String paymentFeignTimeout(){
try{
TimeUnit.SECONDS.sleep(3);
}catch (InterruptedException e){
e.printStackTrace();
}
return serverPort;
}
}
13利用Eureka简单做一个负载均衡
14,在服务消费放80中写一个Config
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //用于负载均衡机制
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
14,在服务消费者80中写Controller
@RestController
@Slf4j
public class OrderController {
//使用与集群 CLOUD-PAYMENT-SERVICE是生成这在eureka上注册的名称
public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";
@Resource
private RestTemplate restTemplate;
@Resource
private DiscoveryClient discoveryClient;
@Resource
private LoadBalancer loadBalancer;
//postForEntity:返回对象为postForEntity对象,包含了响应中的一些重要信息
//比如相应头,响应状态码,响应体等
@GetMapping("/consumer/payment/create")
public CommonResult<Payment> create(Payment payment){
return restTemplate.postForEntity(PAYMENT_URL+"/payment/create",payment,CommonResult.class).getBody();
}
//getForObject返回对象为响应体中数据装话成的对象,基本上可以理解为json
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
}
15,测试结果:http://localhost/consumer/payment/get/2
8001,8002交替出现