微分布式开发------eureka学习(二)
上一节讲述了搭建使用netfilx包搭建eureka项目,这节是对于eureka使用的记录。
上节中,创建了一个server,两个client,虽然并没有完全展示,但是具体流程就是上述将的那样。
一、通过eureka来消费接口
创建controller实现mapping就不说了,只要了解过SpringMvc做过开发的都会去实现。这里主要讲通过RestTemplate实现接口的调用。RestTemplate是Spring访问Rest服务的客户端,可以直接使用他来直接调用接口,其内部实现了多种快捷的远程http访问服务。代码如下:
@Configuration
public class BeanConfigration {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
当然这个RestTemplate 是客户端调用的时候使用的,所以是在client需要进行实例化和配置的。当配置好后,就可以在客户端中进行使用:
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hcc")
public String eurekaTest(){
return restTemplate.getForObject("http://client01/test/hcc", String.class);
}
这里需要注明的是,restTemplate.getForObject()是一个多态的方法,有4个方法,其他的暂时还没研究,现在用的是(Url, 返回参数类型)的方法。 还有最重要的一点,这个方法controller是在client02中创建的,需要调用client01中的/test/hcc, 所以后边的url是client01的,不要误解,我只是懒得起名字和好记,所以访问路径订的一样了。
client01是这个项目的名称,有application.yml中进行配置
spring:
application:
name: client01
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
client01 controller
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/hcc")
public String eurekaTest(){
return "HCC";
}
}
二、开启Eureka 认证
现在有一个很重要的问题,eureka Server是我们观察eureka具体运行的关键,相当于是一个eureka的管理后台,之前的配置虽然成功了,但也存在一些安全隐患,我们进入eureka管理页面,我们会得到以下信息:
在最下面我们会看到我们本机的ip,倘若有人知道我们服务器的ip和端口号,就可以在远程随意调用,窃取信息。你可以试试,在另一台机器是否能访问到这个机器。。。。。
添加认证第一步,就是添加依赖,但是在此之前你要明确是在那个服务中添加,这是server安全,所以我们需要在server中添加依赖:
方式---> 到maven repository 中查找相应的依赖,有些东西需要知道信息的来源,不要只粘贴别人的额。。。。。
当然我们选择Springboot包下的security,具体版本可以自己选择,也可以将版本直接注释掉,使用parent引用的版本。
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<!--<version>2.0.4.RELEASE</version>-->
</dependency>
然后去设置server的用户名和密码
spring:
application:
name: server
security:
user:
name: user
password: pwd
这里注意的是 security 是在Spring下, 不和旧版本一样,旧版本是所有security 信息在 根目录下,效果如图
然后去更改客户端配置:
eureka:
client:
service-url:
defaultZone: http://user:aaa@qq.com:8761/eureka/
只是这样的话,启动的时候client 端回报一个错误, 就是找不到要注册的server, unknown server,最主要的原因就是新版本的cloud 最使用security时默认使用了cfrs,我们将cfrs关闭就可以了, 最让人蛋疼的是,之前版本是可以在配置文件中配置的,在最新的版本中,没找到,强行配置了一个也不起作用, 所以接下来的想到的方法就是覆盖启用这个方法的类,经过查询,得知这个类就是WebSecurityConfigurerAdapter,所以个人实现一个子类,覆盖启用的方法,别的全是使用父类的方法。。。。、
@EnableWebSecurity
public class MyWebSecurityConfigurerAdapter extends
WebSecurityConfigurerAdapter {
public void configure(HttpSecurity httpSecurity) throws Exception {
//httpSecurity.csrf().disable();
httpSecurity.csrf().ignoringAntMatchers("/eureka/**");
super.configure(httpSecurity);
}
}
三 实现高可用
这个高可用个人感觉和一个分布式系统的管理差不多,个人曾经学习过hadoop及其集群的搭建,当时做的时候使用的是一主二从,一个master 2个slave。为保持起正常通信,当时首先使用ssh进行3台机器的无密码链接,然后再配置各个Hadoop的配置文件,大概有这个几个文件来着(core、yarn、hdfs),其中配置的一个主要目的就是告诉各个机器的状态和所在的位置(IP),eureka的高可用也是类似,就是启用多个server,然后将各个server进行串联,窗帘的途径就是在配置文件对各个节点进行配置,然后各自想哥哥server注册。。。。
#eureka 配置
eureka:
client:
#是否向注册中心注册,因为其本身就是注册中心所以设为false, 默认是注册的
register-with-eureka: false
#是否需要检测服务, 只有客户端需要检测,提供服务,server只是维护示例
fetch-registry: false
#实例主机设置
service-url:
defaultZone: http://user:aaa@qq.com:8762/eureka/,http://user:aaa@qq.com:8763/eureka/
instance:
hostname: marster
#eureka 配置
eureka:
client:
#是否向注册中心注册,因为其本身就是注册中心所以设为false, 默认是注册的
register-with-eureka: false
#是否需要检测服务, 只有客户端需要检测,提供服务,server只是维护示例
fetch-registry: false
service-url:
defaultZone: http://user:aaa@qq.com:8763/eureka/,http://user:aaa@qq.com:8761/eureka/
#实例主机设置
instance:
hostname: slave1
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://user:aaa@qq.com:8763/eureka/,http://user:aaa@qq.com:8761/eureka/
instance:
hostname: slave2
参考书籍:Spring Cloud 微服务全栈技术与案例实现