服务发现与注册

一、原理与概要
1、前提概要
在上一片文章介绍微服务时,我们有提到电影微服务调用用户微服务获取用户信息的例子,那么本文将来介绍去调用,并在本文中将引入Eureka。

2、服务的发现

这里写图片描述
服务消费者与服务提供者在启动时,都会把服务地址与端口注册到服务发现组件中,当服务消费者需要调用服务提供者时,就会去组件中获得提供者地址,然后消费者就可以去调用了。

3、服务发现组件的功能
    1)服务注册表:核心,提供检查的API和管理API
    2)服务注册
    3)健康检查

4、服务发现的方式
    1)客户端发现
        如:Eureka、zk
    2)服务端发现
        如:Consul + nginx

二、Eureka
1、Eureka原理
这里写图片描述

2、通过Eureka来实现电影微服务来调用用户微服务
1)首先我们需要创建三个工程,microservice-provider-user、microservice-consumer-movie、microservice-discovery-eureka。

工程microservice-provider-user一些配置与文件说明。
pom.xml文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.spring.cloud</groupId>
    <artifactId>microservice-provider-user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>microservice-provider-user</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>   


        <!-- <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency> -->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

在src/main/resources目录下添加user.sql和data.sql,
user.sql

drop table user if exists;
create table user(
    id bigint generated by default as identity, 
    username varchar(40), 
    name varchar(20), 
    age int(3),
    balance decimal(10,2),
    primary key(id)
);

data.sql

insert into user(id, username, name, age, balance) values(1, 'user1', '张三', 20, 100.22)
insert into user(id, username, name, age, balance) values(2, 'user2', '李四', 20, 100.22)
insert into user(id, username, name, age, balance) values(3, 'user3', '王五', 20, 100.22)
insert into user(id, username, name, age, balance) values(4, 'user4', '赵六', 20, 100.22)

包结构如下图:
这里写图片描述

我们创建持久化类UserRepository,代码如下:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.spring.cloud.entity.User;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

}

User.java代码如下:

import java.math.BigDecimal;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @Column
    private String username;
    @Column
    private String name;
    @Column
    private int age;
    @Column
    private BigDecimal balance;



    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public BigDecimal getBalance() {
        return balance;
    }
    public void setBalance(BigDecimal balance) {
        this.balance = balance;
    }

}

UserController.java是我们待会要在浏览器中访问的类,代码如下:


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.spring.cloud.entity.User;
import com.spring.cloud.repository.UserRepository;

@RestController
public class UserController {

    @Autowired
    private UserRepository userRep;
    @GetMapping("/simple/{id}")
    public User findById(@PathVariable Long id){
        return userRep.findOne(id);
    }

最后,就是我们的Application类了,这里我就不贴代码了。

同样的道理,我们创建microservice-consumer-movie和microservice-dicovery-eureka工程

这里我再说下microservice-consumer-movie功能的的一些类MovieController和Application类

MovieController.java

@RestController
public class MovieController {

    @Autowired
    private RestTemplate restTmp;

    @GetMapping("/movie/{id}")
    public User findById(@PathVariable Long id){
        return restTmp.getForObject("http://localhost:7900/simple/" + id, User.class);
    }
}
在该类中,我们指定了所要访问的user微服务的地址localhost:7900。

MicroserviceSimpleConsumerMovieApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class MicroserviceSimpleConsumerMovieApplication {

    /**
     * 该方法以方法名称作为注解名称,
     * <p><b style='color:red'>注意:这个方法的方法名与MovieController的RestTemplate的实例名称一样</b>
     * @return
     */
    @Bean
    public RestTemplate restTmp(){
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(MicroserviceSimpleConsumerMovieApplication.class, args);
    }
}
这个Application类,我们定义了一个方法,restTmp(),这里要为什么要定义这个方法了,因为在MovieController中,我们有使用了RestTemplate类,但是这个类在启动application后,是不存在这样的一个bean的,那么我们在这里就通过注解@Bean来创建一个bean的时间,在MovieController中可以进行实例化。

好了,三个工程都创建好了的话,我们先启动eureka server服务,启动完了之后,在分别启动movie和user微服务,当都启动成功之后,我们通过浏览器访问http://localhost:8761进入eureka服务,在“Instances currently registered with Eureka”项中列出来已经成功注册到Eureka Server的微服务。

最后,我们在浏览器中访问http://localhost:8010/movie/3
浏览器中打印出:
{
    id: 3,
    username: "user3",
    name: "王五",
    age: 20,
    balance: 100.22
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值