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>
View Code

   配置文件: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页面了,目前还没有服务注册上去。。。

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>
View Code

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);
    }
}

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

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 服务的接口。。。。。

 

posted @ 2019-08-20 11:05  Chris,Cai  阅读(353)  评论(0编辑  收藏  举报