Eureka已停更!!!
Eureka是实现服务注册与发现的组件,围绕它有两个重要的角色:
Eureka Server(服务注册中心或Eurake服务端)和Eureka Client(Eurake客户端),其中Eureka Client又包含Provider Service(服务提供方),Consumer Service(服务消费方)。结构如下图如下如:
在实现负载均衡时,通过将Eureka Client中的服务(服务方/消费方)注册到Eureka Server,就可以用“服务方/消费方”的实例名代替IP,防止服务所在节点的IP变化之后,其它服务无法调用的问题。
Eureka使用:
准备工作:微服务架构进行服务间的调用,而在这个过程中,使用到了一个工具,叫做 RestTemplate(RestTemplate 是由 Spring 提供的一个 HTTP 请求工具),需要在客户端的消费方创建配置类的包和配置类,并将restTemplate对象注入到消费方的controller层中
package com.atguigu.springcloud.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig {
@Bean
// @LoadBalanced(负载均衡)
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
并将restTemplate对象注入到消费方的controller层中
package com.atguigu.springcloud.controller;
import com.atguigu.springcloud.entities.Payment;
import com.atguigu.springcloud.entities.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@Slf4j
@RequestMapping("consumer/payment")
public class OrderController {
public static final String url = "http://localhost:8002/payment/";
// public static final String url = "http://CLOUD-PAYMENT-SERVICE/";
@Resource
private RestTemplate restTemplate;
@PostMapping("create")
public CommonResult<Payment> create(Payment payment) {
return restTemplate.postForObject(url + "payment/create", payment, CommonResult.class);
}
@GetMapping("get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Integer id) {
return restTemplate.getForObject(url + "payment/get/"+id, CommonResult.class);
}
}
正式使用Eurake
步骤一:添加Eurake依赖:
Eurake依赖有客户端依赖和服务端依赖,二者不同
分别在客户端服务端添加依赖
客户端:(再次强调:客户端包括服务提供发和服务消费方)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.0.2</version>
</dependency>
服务端:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>3.0.2</version>
</dependency>
步骤二:修改yml文件
修改服务端application.yml配置文件
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称,分布式集群需要在本地配置了实例名-ID映射
client:
#表示不向注册中心注册自己
register-with-eureka: false
#表示自己就是服务中心,我们的职责是维护服务实例,并不需要区检索服务
fetch-registry: false
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ #
修改客户端“消费方”application.yml配置文件
server:
port: 80
spring:
application:
name: cloud-order-service #服务名
eureka:
client:
register-with-eureka: true #是否向注册中心注册自己
fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://localhost:7001/eureka #单机版
# defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka #集群版
修改客户端“提供方”application.yml配置文件
server:
port: 8001
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: root
url: jdbc:mysql://localhost:3306/db2021?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
# useSSL=false 安全连接
# useUnicode=true 允许用户自己设定编码
# characterEncoding=utf-8 设置数据库编码为UTF-8
# serverTimezone=GMT%2B8 设置时区(mysql8)
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapperLocations: classpath:mapper/*.xml
typeAliasesPackage: com.atguigu.springcloud.entities
# configuration: #配置日志(打印sql语句) #MP中SQL不可见 需要通过日志查看
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
eureka:
client:
register-with-eureka: true #是否向注册中心注册自己
fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
service-url:
#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://localhost:7001/eureka
# defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka #集群版
步骤三:分别在Eurake客户端和服务端的启动类上添加Eurake注解
注意:Eureka的bug,即使不加注解也没事!!!
客户端:@EnableEurekaClient(客户端包括服务提供方和消费方,下面的为提供方)
package com.atguigu.springcloud;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
@MapperScan("com.atguigu.springcloud.dao")
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class);
}
}
服务端:@EnableEurekaServer
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class);
}
}
在不搭建集群的情况下,到此结束
标题搭建集群(修改上面的注释)
并在本地找到:C:\Windows\System32\drivers\etc\hosts
注意:服务端集群搭建是服务端之间相互注册
优化:如果想在Eurake面板上看到端口号和服务名
需要在Eurake客户端(提供方、消费方)添加如下配置
eureka:
instance:
instance-id: payment8002 #服务名
prefer-ip-address: true #访问路径可以显示IP
Eureka自我保护机制:
注册到Eureka中的服务,在某个时刻不可用了,Eureka不会立刻清理,依旧会对该服务信息进行保存。
关闭自我保护:
找到Eureka服务端所对应的配置文件:
默认为true(开启),设置为false就关闭了自我保护。