目录
一.SpringCloud项目结构
1.Eureka注册发现服务
springcloud使用服务发现框架来管理微服务。
使用IDEA创建项目,选择spring Initializr,然后点击next(如果不能正确显示,说明网络有问题),
再进行项目基本信息填写之后,选择cloud discovery中的eureka service。选择spring boot的版本2.1.4
创建成功之后查看pom.xml文件,可以查看到spring cloud已经导入
springboot是2.1.4的正式版
springcloud是Greenwich.SR1正式版之后的第一次修正版
根据官网的介绍,Greenwich版本对应的刚好是springboot2.1.x的版本,所以pom文件的版本配置是OK的。
项目创建成功来,现在就开始写代码吧。
首先,作为spring的一个发现服务(此处项目起名为yiyuancloud),本身是不需要逻辑代码的。
在application.properties(很多人都习惯使用application.yml,因为本人习惯了properties,这里就不作更改了)中配置
server.port=8761
eureka.instance.hostname=localhost
#是否需要向服务端进行注册,如果只获取不注册,设置为false
eureka.client.register-with-eureka=false
#是否需要从服务端获取注册信息,服务端如果是集群需要配置为true
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
然后在启动类上加上注解
@EnableEurekaServer
启动项目,访问http://localhost:8761/即可看到Eureka的服务注册信息。
2.Eureka提供者服务
和第一步一样创建项目provider。修改application.properties
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
server.port=8773
spring.application.name=service-provider
然后在启动类上加上注解
@EnableEurekaServer
启动项目,访问http://localhost:8761/即可看到Eureka上新注册的provider信息service-provider。
修改启动类,测试代码
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableEurekaClient
@RestController
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
@Value("${server.port}")
String port;
@RequestMapping("/hi")
public String home(@RequestParam String name)
{
return "hi " + name + ",i am from port:" + port;
}
}
访问http://localhost:8773/hi?name=武松
3.Eureka消费者服务
和第一步一样创建项目customer。修改application.properties
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
server.port=8764
spring.application.name=feign-consumer
#断路器
feign.hystrix.enabled=true
在启动类上加入注解
@EnableEurekaClient启动项目,访问http://localhost:8761/即可看到Eureka上新注册的customer信息feign-customer。
修改启动类,添加HelloController和HelloService
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableEurekaClient
@EnableHystrix
public class CustomerApplication {
public static void main(String[] args) {
SpringApplication.run(CustomerApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate()
{
return new RestTemplate();
}
}
@RestController
public class HelloController
{
@Autowired
HelloService helloService;
@RequestMapping(value = "/hi")
public String hi(@RequestParam String name)
{
return helloService.hiService(name);
}
}
@Service
public class HelloService
{
@Autowired
RestTemplate restTemplate;
// 断路器配置,当无法调用如下方法时,就会调用自定的hiError方法。
@HystrixCommand(fallbackMethod = "hiError")
public String hiService(String name)
{
String str1 = restTemplate.getForObject("http://service-provider/hi?name=" + name, String.class);
return str1;
}
public String hiError(String name)
{
return "hey " +
name + ", there is some problem with hi page";
}
}
这时候访问http://localhost:8764/hi?name=fys。可知,该接口调用的是provider服务中的/hi接口
如果这时候关闭provider服务,customer将会进入断路器配置的hiError方法
4.Eureka的高可用性
Eureka的高可用性实现为多个Eureka的相互注册,这样哪怕只剩一个eureka服务,系统仍然能够完好运行。例如现在有三个erueka1:8761,erueka2:8762,erueka3:8763
重点:遇坑笔记,在正式版的springcloud中,同一域名只能配置一个erueka服务。
想要配置多服务,可以修改host文件进行转发
erueka1的配置为
eureka.client.service-url.default-zone=http://eureka2:8762/eureka/,http://eureka3:8763/eureka/
erueka2的配置为
eureka.client.service-url.default-zone=http://eureka1:8761/eureka/,http://eureka3:8763/eureka/
erueka3的配置为
eureka.client.service-url.default-zone=http://eureka1:8761/eureka/,http://eureka2:8762/eureka/
同时在注册服务,比如customer中的注册地址设置多个
eureka.client.service-url.defaultZone= http://eureka1:8761/eureka/,http://eureka2:8762/eureka/,http://eureka3:8763/eureka/
访问http://eureka1:8761/可以看到eureka1,eureka2,eureka3相互注册成功
至此。最基本的微服务框架就ok了。
yiyuancloud服务用来管理发现
provider和customer作为微服务之间通过restful进行通信。
补充:Eureka还拥有心跳检测,健康检查,负载均衡等功能。