SpringCloud服务的注册发现--------Eureka

1,什么叫做服务的注册与发现

服务的注册与发现基于注册中心,注册中心本身是一个服务,也相当于一个载体,其他服务的注册需要注册到这个注册中心上。

注册:当服务器启动的时候,会将自己的服务器信息,通过别名的形式注册到之前已经启动的注册中心上面

发现:在注册中心上面注册的服务,由注册中心共同管理,以该别名的方式去注册中心上获取到实际的服务通讯地址,让后在实现本地rpc调用远程

2,搭建注册中心

eureka注册中心:maven依赖

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--SpringCloud eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

配置文件:127.0.0.1:8100 启动路径

server:
port: 8100
eureka:
instance:
###注册到eurekaip地址
hostname: 127.0.0.1
client:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
###因为自己是为注册中心,不需要自己注册自己
register-with-eureka: false
###因为自己是为注册中心,不需要检索服务
fetch-registry: false

启动类:需要加上@EnableEurekaServer

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(final String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}

这样访问127.0.0.1:8100就可以进入eureka注册中心的web页面了,目前还没有服务注册上去。。。

SpringCloud服务的注册发现--------Eureka

3,实现服务注册

开始注册会员服务和订单服务:

配置都一样:就是配置文件上的地址不同

member,order 的maven依赖

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot整合eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

member的配置文件:name就是注册的别名,member的端口是8000,注册到注册中心上

###服务启动端口号
server:
port: 8000
###服务名称(服务注册到eureka名称)
spring:
application:
name: app-aiyuesheng-member
###服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
###需要注册到eureka
register-with-eureka: true
###是否需要从eureka上获取注册信息
fetch-registry: true

orderr的配置文件:name就是注册的别名,member的端口是8001,注册到注册中心上

###服务启动端口号
server:
port: 8001
###服务名称(服务注册到eureka名称)
spring:
application:
name: app-aiyuesheng-order
###服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
###需要注册到eureka
register-with-eureka: true
###是否需要从eureka上获取注册信息
fetch-registry: true

添加启动类:

@SpringBootApplication
@EnableEurekaClient
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}

启动之后,两个服务都会注册到注册中心上了。。。

SpringCloud服务的注册发现--------Eureka

4,实现服务发现(实现rpc远程调用)

order 添加映射地址:

@RestController
public class IndexOrderController { @RequestMapping("/getOrder")
public String getOrder(){
return "获得订单成功";
} }

member 添加映射地址,去调用order 服务:

@RestController
public class IndexMemberController { // 封装了http方法,显得更加的优雅
@Autowired
private RestTemplate restTemplate; @RequestMapping("/getOrder")
public void getOrder() {
// url会在eureka注册中心上通过别名进行查找,restTemplate通过别名来找服务,是依赖ribbon,所以@LoadBalanced要在RestTemplate初始化要加上
String orderUrl = "http://app-aiyuesheng-order/getOrder";
String res = restTemplate.getForObject(orderUrl, String.class);
System.out.println("rpc远程调用服务成功");
System.out.println(res);
}
}

通过RestTemplate 去实现httpClient 的功能,即rpc 远程调用,因为RestTemplate是依赖客户端负载均衡器Ribbon的,所以在将RestTemplate注入到Spring容器中的时候,需要加上注解@LoadBalanced

将RestTemplate注入到Spring容器中:

@SpringBootApplication
@EnableEurekaClient
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
} // 注册到spring容器中
@Bean
// 开启负载均衡
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
} }

访问:127.0.0.1:8000/getOrder 这是会员的入口,能够进入到order 服务的接口。。。。。

上一篇:SpringCloud服务的注册发现--------consul实现服务与发现


下一篇:Java NIO Buffer缓冲区