关键依赖
sprinbootcloud org.springframework.boot spring-boot-starter-parent 2.3.3.RELEASE org.springframework.cloud spring-cloud-dependencies Hoxton.SR5 pom import
启动Eureka:
依赖:
这里我们要启用的是eureka服务端,也就是提供注册中心的,想要注册在eureka上的服务只需要把server改为clientorg.springframework.cloud spring-cloud-starter-netflix-eureka-server
一给普通的springboot加上这个依赖并且在启动类上注解额外加上@EnableEurekaServer
这样他就是一个Eureka注册中心了
配置文件:
server:
port: 8090
# eureka 配置
# eureka 一共有4部分 配置
# 1. dashboard:eureka的web控制台配置
# 2. server:eureka的服务端配置
# 3. client:eureka的客户端配置
# 4. instance:eureka的实例配置
eureka:
instance:
hostname: localhost # 主机名
client:
service-url:
# eureka服务端地址,将来客户端使用该地址和eureka进行通信
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
#这里本实例的身份是提供一个注册中心,所以不需要以下两个选项为true
register-with-eureka: false # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要
fetch-registry: false # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要
启动以后浏览器直接访问Eureka所部署的端口就可以查看控制面板;
上面我们创造了一个Eureka服务端,注册发现中心
下面我们创建Eureka的客户端
无论是消费者还是生产者,在注册中心的注册模式都是一样的,注册在上面的可以是消费者也可以是生产者,所以他们的配置一样,注意服务名称,需要靠这个获取服务的url进行调用
依赖:
客户端依赖,在Eureka眼里除了他自己,所有服务都是客户端,所有服务都可以互相调用,谁都能是消费者和生产者org.springframework.cloud spring-cloud-starter-netflix-eureka-client
配置文件:
#此配置文件,消费者生产者一视同仁,反正就是往eureka注册就对了
server:
port: 8088
eureka:
instance:
hostname: localhost # 主机名
client:
service-url:
defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
spring:
application:
# 名字注意区分,一种服务一个名字
name: eureka-provider # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
无视这个红字,稍后解释
到了这里我们已经完成了服务的注册,但是我们要怎么去调用服务呢
之前我们是使用手动输入url的方式进行调用的,现在我们通过注册中心,即时的拿到url进行调用
我们在消费者的启动类上添加注解
@EnableDiscoveryClient //激活DiscoveryClient,发现客户端
@EnableEurekaClient //声明为Eureka的客户端
@SpringBootApplication //不解释
public class ConsumerMain {
public static void main(String[] args) {
SpringApplication.run(ConsumerMain.class,args);
}
}
编码进行服务的调用
这里首先进行的是使用Spring封装的restTemplate发起http服务调用
和原来我们需要记住url不同这次我们通过eureka即时的获取生产者的地址进行服务调用;
discoveryClient.getInstances("eureka-provider")通过服务名称获取指定类型服务的地址集合[集群状态预备],然后通过控制集合中终端的选取来做到调用以及负载均衡
// Discover获取url集合的方式进行调用
@GetMapping("/DiscoverClientGetUser/{id}")
public ResponseEntity DiscoverClientGetUser(@PathVariable("id") String id) {
log.info("请求参数:" + "[" + id + "]");
List instances = discoveryClient.getInstances("eureka-provider");//这里输入我们服务提供者注册往Eureka时配置的服务名称,通过这个获取他的rul进行调用
//获取到的就是该服务的所有url路由,为什么是集合呢。因为集群啊,没有集群用个吉尔的cloud;如果只有一个就是一个调用咯。看你怎么操作这个集合就怎么进行负载均衡了
if (CollUtil.isEmpty(instances)) {
// 集合没有数据,抛出服务异常
throw new ServerMissException(4041, "没有服务被发现");
}
//根据集合长度随机获取一个服务提供者
ServiceInstance instance = instances.get(new Random().nextInt(instances.size()));
int port = instance.getPort();
String host = instance.getHost();
String uri = "/provider/getUser/"+id;
//获取host和port组成url发起请求
String url="http://"+host+":"+port+uri;
User user = restTemplate.getForObject(url, User.class);
return ok(Objects.requireNonNull(user));
}
在这里虽然已经能即时发现并调用了,但是我们还是要管理大量的uri,稍后我们会使用一种更优解,解决这个问题



