一.了解SpringCloudNetflix
SpringCloudNetflix是Netflix公司开发,又来加入spring并且集成到springClound,是springCloud的主要组件,SpringCloudNetflix可以为我们项目提供服务发现、断路器和监控、智能路由、客户端负载均衡等
可以参考下图
组件介绍
- Eureka,服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注册的服务的界面。 所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。
- Zuul,网关,所有的客户端请求通过这个网关访问后台的服务。他可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Eureka获取注册的服务来转发请求。
- Ribbon,即负载均衡,Zuul网关将一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过一定的负载均衡策略来发送给某一个服务实例。
- Feign,服务客户端,服务之间如果需要相互访问,可以使用RestTemplate,也可以使用Feign客户端访问。它默认会使用Ribbon来实现负载均衡。
- Hystrix,监控和断路器。我们只需要在服务接口上添加Hystrix标签,就可以实现对这个接口的监控和断路器功能。
- Bus, 消息总线,跨进程的通信机制,用于在上下游之间传递消息。
- Sleuh,链路追踪,服务调用的线路监控
- ....
二.Eureka的认识
2.1介绍
Eureka作用主要是注册和发现,它包含了EurekaServer 服务端(也叫注册中心)和EurekaClient客户端两部分组成,EurekaServer是独立的服务,而EurekaClient需要集成到每个微服务中。
简单的说就是帮助我们统一的管理通信地址
其他功能
服务续约 微服务(EurekaClient)有定时(LeaseRenewalIntervalInSeconds:默认30s)发送 " 心跳"给Eureka的服务端,服务端通过是否有按时发送来判断微服务是否存在,如果连续三次未发送的话就会清楚该微服务,这个行为我们又叫做服务下线
2.2java代码
1.在springboot项目中导入依赖并创建子模块
<!--1.管理 SpringCloud的jar包
-->
<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>
<!--2.测试和小辣椒-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2.在eureka_service中导入springCloud的服务依赖
注意:需要导web!! 导web!! 导web!! -别问,问就是不知道
<dependencies>
<!--spring-cloud-starter-netflix-eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.在eureka_service的启动类中加入
/
* 注册中心启动类
* @EnableEurekaServer : 开启EurekaServer服务端
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication1010
{
public static void main( String[] args )
{
SpringApplication.run(EurekaServerApplication1010.class);
}
}
4.在eureka_service中配置yml
server:
port: 1010 #端口自定义
eureka:
instance:
hostname: localhost #主机
client: #客户端配置
registerWithEureka: false #EurekaServer自己不要注册到EurekaServer自己 ,只有EurekaClient才注册
fetchRegistry: false #EurekaServer不要拉取服务的通信地址列表 ,只有EurekaClient才拉取地址列表
serviceUrl: #注册中心的注册地址
defaultZone: http://localhost:1010/eureka/ #http://${eureka.instance.hostname}:${server.port}/eureka/
server:
enable-self-preservation: false #关闭自我保护警告
5.测试启动--输入服务器地址能进入下面页面就说明成功啦!
是成功了三分之一啦 嘿嘿
下面我们开始配置eurekaClient
1.在eureka_user中导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.启动类
/
* 用户的启动类
* @EnableEurekaClient: 标记该应用是 Eureka客户端
*/
@SpringBootApplication
@EnableEurekaClient
public class UserServerApplication1020
{
public static void main( String[] args )
{
SpringApplication.run(UserServerApplication1020.class);
}
}
3.yml配置
#注册到EurekaServer
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1010/eureka/
instance:
prefer-ip-address: true #使用ip地址进行注册
instance-id: user-server:1020 #实例ID
spring:
application:
name: user-server
server:
port: 1020
4.测试
先启动eureka_serv后再启动eureka_user
这里就可以显示了就说明配置成功了 eureka_order也是一样的配置这里就省略了
2.3实现服务通信
1.搭建公共模块user_comm
在user_comm中创建domain对象
@Data
public class User {
private Long id;
private String username;
private String desc;
}
2.在eureka_user和eureka_order模块中导入user_comm模块
<dependency>
<groupId>cn.zs.springboot</groupId>
<artifactId>user_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
3.编写eureka_user模块的控制层
//用户服务:暴露接口给订单访问
@RestController
public class UserController {
//订单服务来调用这个方法 http://localhost:1020/user/10
// @GetMapping(value = "/user/{id}" )
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
public User getById(@PathVariable("id")Long id){
//根据id去数据库查询User
return new User(id,"zs:"+id,"我是zs");
}
}
4.在eureka_order模块的启动类中说明RestTemplate
//配置一个RestTemplate ,Spring封装的一个机遇Restful风格的http客户端 工具
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
5.编写eureka_order模块的控制层
//订单服务
@RestController
public class OrderController {
//需要配置成Bean
@Autowired
private RestTemplate restTemplate ;
//浏览器调用该方法
@RequestMapping(value = "/order/{id}",method = RequestMethod.GET)
public User getById(@PathVariable("id")Long id){
//发送http请求调用 user的服务,获取user对象 : RestTemplate
//目标资源路径:user的ip,user的端口,user的Controller路径
String url = "http://localhost:1020/user/"+id;
//发送http请求
return restTemplate.getForObject(url, User.class);
}
}
6.测试
到这里就大功告成啦,如果想继续学习集群就请继续往下看
2.4服务集群
大家可能刚接触的时候会有一些蒙圈或者感觉服务集群会有难度,其实能这里给大家的集群是非常简单的,只需要在我们上面的代码做一点小小的修改即可
1.修改eureka_user中的yml配置
我们只需要更改两个地方即可 1.实例ID 2. 端口号
eureka:
client:
serviceUrl:
defaultZone: http://localhost:10010/eureka/
instance:
instance-id: user-server1 #实例ID -- 更改为不一致的
spring:
application:
name: user-server
server:
port: 1031 #端口号 -- 更改为不一致的
2.在order中导入Ribbn依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
3.修改eureka_order的控制层
1. 注入port
2. 将之前写的 localhost:端口 改为 eureka_user中配置的服务名
application:
name: user-server
@RestController
public class OrderController {
//需要配置成Bean
@Autowired
private RestTemplate restTemplate ;
//浏览器调用该方法
@RequestMapping(value = "/order/{id}",method = RequestMethod.GET)
public User getById(@PathVariable("id")Long id){
//发送http请求调用 user的服务,获取user对象 : RestTemplate
//user的ip,user的端口,user的Controller路径
//String url = "http://localhost:1020/user/"+id;
String url = "http://user-server/user/"+id;
//发送http请求
return restTemplate.getForObject(url, User.class);
}
}
4.在eureka_user的启动类点击配置
PS: 只改eureka_user
我是22版本ieda,可能其他版本位置不一样
勾选上即可
5.我们现在只需要在第一次启动eureka_user之后,更改yml配置中的 实例ID 和端口 再次启动就是不一样的地址啦
赶紧去试试吧!!