前沿
首先说下springboot和springcloud的区别,springboot是简化配置的spring框架,本质上只是为了提升程序员的开发效率,减少重复的配置工作,springcloud是目前比较流行的微服务矿建,为企业提供了一站式的解决方案,包括服务注册等功能。所以总结下来,springboot就像一个个体一样,springcloud就像一个大的集合一样。其实,如果要做比喻的话,springcloud就像品牌电脑一样,各个部件已经固定,springboot就像组装电脑一样,需要什么样的部件还需要自己配置。
因为以上原因,小公司由于自身条件所限,推荐选用springcloud搭建自身服务,这样也可以避免各个组件之间的版本冲突问题。搭建的话可以从官网上下载,也可以用idea创建。
如果要自己搭建项目,这里说下自己遇到的坑,首先springboot2.0以后不再支JDK1.7所以推荐使用JDK1.8,开发使用IDEA,但是如果版本选的太高,兼容springcloud又是问题,因此推荐使用springboot2.0。
springcloud包括了各大组件,首先说下eureka搭建服务中心,eureka的好处包括:具备负责均衡功能(如果创建多个服务,会平衡调用);不需要下载安装注册中心,可直接搭建使用。
一、搭建注册中心
添加依赖
启动类添加@EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
配置文件添加内容
#设置tomcat服务端口号
server.port=8080
#设置服务名称
spring.application.name=eureka-server
eureka.instance.hostname=localhost
#注册中心不需要注册自己
eureka.client.register-with-eureka=false
#注册中心不需要去发现服务
eureka.client.fetch-registry=false
#设置服务注册中心的URL
eureka.client.serviceUrl.defaultZone=http://
e
u
r
e
k
a
.
i
n
s
t
a
n
c
e
.
h
o
s
t
n
a
m
e
:
{eureka.instance.hostname}:
eureka.instance.hostname:{server.port}/eureka
启动文件,请求http://localhost:8080/,即可点开注册中心
注意:
1)spring-cloud-starter-netflix-eureka-server是netflix公司封装的方法,由于版本兼容的问题,推荐使用spring-cloud-starter-netflix-eureka-server依赖。
2)springcloud和springboot兼容关系:
Spring Cloud Spring Boot
Finchley 兼容Spring Boot 2.0.x,不兼容Spring Boot 1.5.x
Dalston和Edgware 兼容Spring Boot 1.5.x,不兼容Spring Boot 2.0.x
Camden 兼容Spring Boot 1.4.x,也兼容Spring Boot 1.5.x
Brixton 兼容Spring Boot 1.3.x,也兼容Spring Boot 1.4.x
Angel 兼容Spring Boot 1.2.x
二、服务注册
添加依赖:
同理,使用netflix封装的jar包spring-cloud-starter-netflix-eureka-client,与server包相对应
配置文件添加内容:
#设置tomcat服务端口号
server.port=8081
#设置服务名称
spring.application.name=eureka-server
eureka.instance.hostname=localhost
#设置服务注册中心的URL
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/
端口号server.port=8081与注册中心不同,设置服务注册中心的URL与注册中心一致
启动类添加注解@EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
public class SpringbootServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootServerApplication.class, args);
}
}
同样,与@EnableEurekaServer相对应。
启动服务类后,刷新注册中心的地址,http://localhost:8080/,就可以看到注册的服务。
三、服务的调用
通过以上两步,我们已经完成了服务的注册和发现逻辑,接下来要实现服务的远程调用。在以前,如果项目本身逻辑比较简答,可以使用一站式的框架来解决问题(springmvc),后来通过不断发展,需要将项目进行拆分,用不同的模块和服务进行装载,并且放在不同的服务器上,这就是集群的概念,由于在不同服务器上,因此要解决项目之间的通信问题,以前的话可能会使用到httpclient,但springcloud作为微服务框架,本身就是解决服务之间的通信问题,甚至也包括了跨平台问题。在这里,我们用的是feign。
首先,在以上创建的项目中,再次创建一个eureka-server2的服务。其他基本都一致,配置文件修改如下:
#设置tomcat服务端口号
server.port=8082
#设置服务名称
spring.application.name=eureka-server2
eureka.instance.hostname=localhost
#设置服务注册中心的URL
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/
启动项目,刷新注册中心,这时可以发现我们的注册中心注册了2个服务
接下来,修改eureka-server2,添加feign依赖
启动类增加注解@EnableFeignClients开启服务
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SpringbootClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootClientApplication.class, args);
}
}
增加Feign接口
@FeignClient(value = “eureka-server”)
public interface TestHome {
@RequestMapping("/helloworld")
public String index(@RequestParam(“name”) String name);
}
注解@FeignClient里面的值填写需要远程调取服务的服务名
配置相应的Controller
@RestController
public class ClientController {
@Autowired
TestHome TestHome;
@RequestMapping("/hellworld")
public String index(@RequestParam(“name”)String name){
System.out.println(“this is client”);
return TestHome.index(name);
}
}
再回到eureka-server服务,增加相应的Controller
@RestController
public class ServerController {
@RequestMapping("/helloworld")
public String index(@RequestParam("name")String name){
System.out.println("this is server");
return "hello "+name + ", the connect is success";
}
}
重新启动服务,请求http://localhost:8082/hellworld?name=AAA,页面得到返回值:hello AAA, the connect is success,eureka-server显示打印信息:this is server,eureka-server2显示打印信息:this is client。
至此Feign搭建完成。
四、断路器(hystrix)
断路器是集成在Feign包里,因此不需要再单独引入其他依赖,这里需要说明的是,由于本文使用的是springboot2.0.3,因此引入的feign依赖是spring-cloud-starter-openfeign。
截至目前,我们实现了一个注册中心eureka-service,2个已经注册的服务eureka-server、eureka-client,并且实现了eureka-client到eureka-server的通信连接,假如此时eureka-server服务关掉,eureka-client再次请求就会一直处于等待状态,直到后台报错,这将花费大量的资源,因此引入断路器(hystrix)功能。
Hystrix配置在eureka-client中,如果eureka-server服务不可用,eureka-client将直接返回结果,进行后续逻辑,不再继续等待。因此修改eureka-client代码即可。
添加断路器类,添加注解@Component,实现上面已经写好的接口
@Component
public class TestHomeHystrix implements TestHome {
@Override
public String index(@RequestParam(“name”) String name) {
return “hello “+name + “, the connect is fail”;
}
}
接口的注解添加断路器类
@FeignClient(value = “eureka-server”,fallback=TestHomeHystrix.class)
public interface TestHome {
@RequestMapping(”/helloworld”)
public String index(@RequestParam(“name”) String name);
}
properties添加开启断路器方法
#断路器
feign.hystrix.enabled=true
现在开始测试,如果一切正常,请求http://localhost:8082/hellworld?name=AAA,返回的结果是hello AAA, the connect is success,这时,我们停掉eureka-server,再次请求,得到的结果是hello AAA, the connect is fail,测试成功。
五、总结
以上,我们完成了springcloud基本的几个功能,eureka注册与发现、feign远程请求、Hytrix断路器