创建Spring Cloud项目
创建父项目(Maven项目即可),在pom.xml中引入spring cloud依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.yun</groupId>
<artifactId>framework-server</artifactId>
<version>1.0.0</version>
<name>framework-server</name>
<description>框架服务</description>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
spring boot 和spring cloud对应的版本
Spring Boot | Spring Cloud |
---|---|
1.2.x | Angel版本 |
1.3.x | Brixton版本 |
1.4.x stripes | Camden版本 |
1.5.x | Dalston版本、Edgware版本 |
2.0.x stripes | Finchley版本 |
2.1.x | Greenwich版本 |
搭建注册中心-eureka
创建Module项目,在pom.xml文件中加入eureka依赖
<parent>
<groupId>com.yun</groupId>
<artifactId>framework-server</artifactId>
<version>1.0.0</version>
<relativePath/>
</parent>
<groupId>com.yun</groupId>
<artifactId>server-eureka</artifactId>
<version>1.0.0</version>
<name>server-eureka</name>
<description>注册中心</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
在启动类加入注解@EnableEurekaServer
application.yml配置
#配置端口
server:
port: 8081
spring:
application:
#配置服务名称
name: server-eureka
eureka:
client:
#是否从Eureka Server获取信息
fetch-registry: false
#是否注册到注册中心,默认为true
register-with-eureka: false
service-url:
#设置注册中心地址,默认端口为8761
defaultZone: http://localhost:${server.port}/eureka
然后!!!将项目跑起来,在浏览器输入:http://localhost:8081/ 就可以进入到注册中心的页面,PS:这是一个单节点的服务注册中心
服务的提供者和消费者
什么是服务的提供者和消费者?
上图简要描述了Eureka的基本架构,由3个角色组成:
1、Eureka Server: 提供服务注册和发现
2、Service Provider: 服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到
3、Service Consumer: 服务消费方,从Eureka获取注册服务列表,从而能够消费服务
怎么实现的呢?
服务的发现和消费其实是两个行为,这两个行为也是由两个不同的对象来完成,分别是Eureka和Ribbon。Ribbon是一个基于HTTP和TCP的客户端负载均衡器,当Eureka和Ribbon一起使用的时候,Ribbon会从Eu加粗样式reka注册中心中获取服务端列表,然后进行轮询访问以达到负载均衡的作用,服务端这些是否在线这些则由Eureka进行管理。
一、创建服务的提供方
在pom文件中加入以下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在启动类中加入注解@EnableDiscoveryClient
/**
* User服务启动入口
*
* @author Aaron
* @date 2019/12/29 12:32
*/
@EnableDiscoveryClient
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
application.yml配置,主要是配置一下该服务注册到哪里
#配置端口
server:
port: 8082
#配置服务名称
spring:
application:
name: server-user
eureka:
client:
service-url:
#配置注册中心地址
defaultZone: http://127.0.0.1:8081/eureka
/**
* 用户
*
* @author Aaron
* @date 2019/12/30 09:36
*/
@RestController
@RequestMapping("/user")
public class UserController {
/**
* 自我介绍
*
* @author: Aaron
* @date: 2019/12/30 09:40
* @param: [name]
* @description:
* @return: java.lang.String
*/
@GetMapping("/self")
public String selfIntroduction(String name) {
return "my name is " + name;
}
}
二、创建服务的消费方
同样的在pom.xml中加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在启动类加入注解@EnableDiscoveryClient、@EnableFeignClients
/**
* 组织服务启动
*
* @author Aaron
* @date 2019/12/29 18:54
*/
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class OrgApplication {
public static void main(String[] args) {
SpringApplication.run(OrgApplication.class, args);
}
}
配置文件和上面一样,这里就省略了,然后到了重头戏了,服务之间的互相调用(消费)
创建UuserFeign类,用于统一管理user服务接口
/**
* @author Aaron
* @date 2019/12/30 09:42
*/
@FeignClient(name = "server-user", fallback = UserFeignFallback.class)
public interface UserFeign {
/**
* 自我介绍
*
* @author: Aaron
* @date: 2019/12/30 09:49
* @param: name : 姓名
* @description:
* @return:
*/
@RequestMapping(value = "user/self", method = RequestMethod.GET)
String selfIntroduction(@RequestParam("name") String name);
}
这里@FeignClient中的name指的是哪个服务,所以我们之前给每个服务配的服务名称就派上用场啦,然后定义接口,参数、请求方式、返回需要和调用的接口保持一致。
TestCtroller.java
/**
* 测试Fegin
*
* @author Aaron
* @date 2019/12/30 09:35
*/
@RestController
@RequestMapping("/org")
public class TestController {
@Autowired
private UserFeign userFeign;
/**
* @author: Aaron
* @date: 2019/12/30 09:51
* @param: [name]
* @description:
* @return: java.lang.String
*/
@GetMapping("/test")
public String test(@RequestParam("name") String name) {
return userFeign.selfIntroduction(name);
}
}
然后就可以跑项目啦,首先要先启动注册中心,然后再启动其他服务。
最后我们使用PostMan或者其他方式来测试Org服务中的org/test这个接口,看下是否能成功调用到User服务的接口。
各个服务之间的调用其实也是相当于调接口,只不过这边有一个很方便很简单的给我们直接用,那就是Feign,还有一种方式就是RestTemplate。
1.Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单。
2.Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。
3.而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。
4.SpringCloud对Feign进行了封装,使其支持SpringMVC标准注解和HttpMessageConverters。
5.Feign可以与Eureka和Ribbon组合使用以支持负载均衡。