1.搭建注册中心
1.1创建项目
可以是子项目,也可以专门新建一个项目。
1.2pom加入依赖
如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
1.3修改yml配置文件
如下:
# Eureka相关配置
# Eureka 服务
server:
port: 10010
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
client:
fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数
register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.
service-url:
# 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1.4启动类
最后我们只需要在启动类加上一个@EnableEurekaServer注解就可以,随后我们启动类,浏览器搜http://127.0.0.1:10010

能看到这个就说明搭建成功了!当然,里面还没有存储IP地址
2.服务注册
也就是服务端去注册中心登记一下自己的IP地址,以便消费者去获取。所以首先我们需要一个服务,然后对这个服务进行一些设置以便于与注册中心建立联系。
2.1加入Eureka依赖
跟注册中心的依赖非常相似,一个是server,一个是client。
如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.2修改yml配置文件
如下:
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10010/eureka/
别忘了设置spring:application:name。注册中心就是存这个名字和对应的IP地址的。
接下来我们可以启动服务端,看有没有被存在注册中心。

Look!成功了,那个ORDER-SERVICE就是设置的spring:appication:name的名字
3.服务发现
服务发现就是指服务A要去访问这个服务B,所以要去注册中心去拿服务B的IP地址。怎么拿呢?具体如下:
3.1依旧加入依赖
你使用Eureka组件肯定要引入相关依赖的,如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.2修改yml配置文件
如下:
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10010/eureka/
你想从注册中心查数据首先要知道注册中心的位置。
3.3修改远程调用代码
在没有使用Eureka组件时,我们想访问另一个服务只能通过RestTemplate类调用方法访问
RestTemplate restTemplate=new RestTemlate();
String url="............";
restTemplate.getForObject("目标服务URL地址",返回类类型.class).var;
这样URL地址就是写死的,但是我们不能保证该服务的URL是不变的,一旦改变我们还要一个个修改这些访问其他服务的方法,很不方便,这就是注册中心的作用:它将服务的URL与服务的唯一名称绑定在一起。我们需要其他服务的URL只需将用DisCoveryClient类的方法查询并接收就可以,如何查询,如下:
DisCoveryClient disCoveryClient -new DisCoveryClient();
disCoveryClient.getInstances("目标服务名称").get(0).getUri.toString().var;
//getInstance返回的是列表,我们通过索引拿第一个
再将这个参数传给restTemplate,这样就避免了硬编码。
修改后代码如下:
List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
String s = instances.get(0).getUri().toString();
String url=s+"/product/getProduct?productId="+orderInfo.getProductId();
ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
759

被折叠的 条评论
为什么被折叠?



