服务发现与注册
一、原理与概要1、前提概要在上一片文章介绍微服务时,我们有提到电影微服务调用用户微服务获取用户信息的例子,那么本文将来介绍去调用,并在本文中将引入Eureka。2、服务的发现服务消费者与服务提供者在启动时,都会把服务地址与端口注册到服务发现组件中,当服务消费者需要调用服务提供者时,就会去组件中获得提供者地址,然后消费者就可以去调用了。3、
一、原理与概要
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)