背景
考虑到单体架构的瓶颈,想必已经有很多同学开始学习微服务内容了。这里和大家一起构建一个简单的Dome;如果想要学习Spring Cloud Alibaba这套治理方案的同学肯定都知道,对于微服务治理方案,最先形成生态规模的就是Netflix,在了解Netflix解决方案之前需要先了解分布式必须面对的四大问题即:
1.客户端如何访问
2.服务间通信
3.如何协调治理
4.如果部分服务挂了怎么办
基于上述问题,Spring Cloud Netflix提供了一整套解决分布式四大问题的方案。这使得学习分布式治理,需要先彻底了解如何解决这些问题的思路。
学习篇一技术选型:
1、选择Eureka作为注册中心,解决如何治理服务的问题。
2、Ribbon作为服务间通信、并使用负载均衡(其实现实是用Fegin的比较多,不过Fegin是基于Ribbon封装的所以有必要先了解),解决服务间通信问题
一、愉快搭建SpringCloud Eureka
1.首先肯定是创建SpringBoot项目然后写依赖了,但是看了网上有很多在导入SpringCloud的Eureka时候遇到很多坑。导致自己的研究还没开始就结束了。
正确的pom.xml引用如下:
1).可以在公共服务Depend里引用下面SpringCloud包依赖
<dependencyManagement>
<!--导入SpringCloud-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2).在本服务也就是Eureka注册服务里继承Depend的`后然后引入
<dependencies>
<!--导入Eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
值得注意的是:
SpringBoot的版本最好不要高于 2.0.9.RELEASE 不然做测试dome会出现问题(本人亲测),原因在此,跟踪F版后发现使用的是2.0.2.RELEASE的引用。所以对SpringBoot有版本约束。这里例子就先这样使用了
2.就可以看看自己是否导入成功依赖,在启动类Application中加入: @EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class yourApplication {
public static void main(String[] args) {
SpringApplication.run(yourApplication.class, args);
}
}
3.再在application.yml中加入以下内容 Eureka 构建就完事了。
#自己服务名称
spring:
application:
name: your-eureka
server:
port: 8081
eureka:
instance:
hostname: localhost
client:
# 没有下面这两个配置,默认是客户端,加上代表自己是注册机
registerWithEureka: false
fetchRegistry: false
# 自己注册中心服务的地址:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
然后访问:
嗯,果然是敏捷开发,就是牛逼。
注册中心配置完成。
二、编写生产者提供服务
1.导入上述jar
依旧是引入继承Depend后引入
<dependencies>
<!--导入Eureka注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencys>
是的,是复制的上面(承认脸)。毕竟您又不能这样
2.构建生产者配置
#生产者名字
spring:
application:
name: your-Producer
server:
port: 8082
eureka:
instance:
hostname: localhost
client:
# 给出注册中心地址
serviceUrl:
defaultZone: http://localhost:8081/eureka/
这个没有复制,认真看哦!
3.加上@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient
public class yourProducer{
public static void main(String[] args) {
SpringApplication.run(yourProducer.class, args);
}
}
4.编写一个处理业务类
@RestController
public class AdminController {
@Value("${server.port}")
private String port;
@RequestMapping(value = "hi",method = RequestMethod.GET)
public String sayHi(String message)
{
return String.format("Hi your message is %s port is %s",message,port);
}
}
ok编写完成就可以运行了。
额,不要以为我打马赛克克是因为业务之类的,其实就是因为额,当时名字起得比较垃圾。对的不堪入目的那种。
额,这不是重点。既然生产者编写完毕那么我们就继续愉快的整消费者吧(我。。。艹 脱离公司项目说这句话真的爽,不过不是那个意思啦)。
三、使用SpringCloud Ribbon编写服务消费者
1.导入jar,对的消费者就只继承f父Depend这个就可以了,里面是包含的
2.启动类添加注解:@EnableEurekaClient
3.创建配置
@Configuration
public class YourProducerTemplateConfigation {
@Bean
//要访问负载均衡服务的生产者
@LoadBalanced
public RestTemplate restTemplate()
{
return new RestTemplate();
}
}
4.创建消费者需要掉用的生产者接口
@Service
public class YourProducerService {
@Autowired
private RestTemplate restTemplate;
public String findHi(String message)
{
return restTemplate.getForObject("http://your-eureka/hi?message="+message,String.class);
}
}
5.编写Croller
@RestController
public class YourProducerController {
@Autowired
YourProducerService YourProducerService;
@RequestMapping(value = "hiWeb",method = RequestMethod.GET)
public String sayHi(String message)
{
return YourProducerService.findHi(message);
}
}
yourDelete就是consumer。
四、测试
调用接口
很明显我们看到注册中心有这个,提示,这说明你的服务没有多个节点保证。如果生产者或者消费者有一个挂掉。就会导致服务不可靠。
那我们其实在实际开发中可以用Docker在不同服务器启动不同服务的节点以保证服务的可靠性。在测试时我们可以这样做以生产者为例:
1.先允许服务启动多例
2.以8082启动,等待生产者服务启动后,修改端口为8083继续启动生产者。这样就有了两个生产者
好了就介绍到这里。
在此要特别感谢千锋教育大佬李卫民先生,在B站提供学习内容。