java环境 服务注册发现Eureka组件
springcloud下单机版的Eureka使用
- 服务注册中心
- 服务提供者
- 服务消费者
Eureka 服务注册发现中心配置
1、pom文件需要添加的依赖
<dependencies>
<!--spring cloud Eureka Server 启动器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!--spring-cloud依赖(注意和springboot版本的兼容)-->
<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>
注意spring-cloud-dependencies和springboot版本的兼容
2、application.properties下配置Eureka的配置属性
# 设置spring应用命名,可以自定义,非必要
spring.application.name=eureka-server
# 设置Eureka Server WEB控制台端口,自定义
server.port=8761
#是否将自己注册到Eureka-Server中,默认的为true(服务器自己就不注册自己了)
eureka.client.register-with-eureka=false
#是否从Eureka-Server中获取服务注册信息,默认为true
eureka.client.fetch-registry=false
3、启动类配置,添加 @EnableEurekaServer 注解
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudEurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaServerApplication.class,args);
}
}
访问地址 http://localhost:8761/ 出现如下图显示配置成功
4、注册中心的安全认证(如果可以任意访问的话,那么其安全性太低)
1、添加依赖
<!--安全认证依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
引入依赖后后默认认证,再次访问 注册服务中心会要求登录
秘密是随机生成的UUID,启动时会显示在控制台。默认用户名是user
用户名和密码也可以在application.properties配置文件中配置
#安全验证
spring.security.user.name=liang
spring.security.user.password=123456
如果要禁用安全认证,可以在启动类中添加exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class}
@EnableEurekaServer
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class})
public class Springcloud01EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(Springcloud01EurekaServerApplication.class, args);
}
}
security安全认证存在跨站调用问题,不然服务提供者和消费者无法跨站调用。
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/eureka/**");
super.configure(http);
}
}
Eureka 服务提供者配置
1、pom文件需要添加的依赖
<dependencies>
<!--Eureka 提供者要引入的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--webmvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--集成 Swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<!--集成 Swagger UI-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
<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>
提供接口服务,所以顺便把swagger的依赖也引入了
2、在apiController包下添加了一个StudentController
@Api(tags = "学生管理相关接口")
@RequestMapping(value = "/student",method = {RequestMethod.GET})
@RestController
public class StudentController {
@ApiOperation("根据id查询用户的接口")
@RequestMapping("/get/{id}")
public String getName(@PathVariable("id") Integer studentId){
System.out.println("打印获取参数:"+studentId);
return "打印获取参数:"+studentId;
}
}
3、在config包下建一个swaggerConfig配置类
注意要添加上@EnableSwagger2注解,不让访问swagger页面会弹出一个alert错误
@Configuration
@EnableSwagger2 //启用 Swagger2
public class swaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.liang.springcloud02eurekaprovider.apiController"))
.paths(PathSelectors.any())
.build().apiInfo(new ApiInfoBuilder()
.title("SpringBoot整合Swagger")
.description("SpringBoot整合Swagger,详细信息......")
.version("1.0")
.license("The Apache License")
.licenseUrl("http://www.baidu.com")
.build());
}
}
4、配置Eureka 客户端注册 (确认以上的swagger和接口能正常访问)
启动类中添加@EnableEurekaClient 注解
@EnableEurekaClient
@SpringBootApplication
public class Springcloud02EurekaProviderApplication {
public static void main(String[] args) {
SpringApplication.run(Springcloud02EurekaProviderApplication.class, args);
}
}
5、在application.properties(或yaml文件)中配置 Eureka的配置信息
提供者的应用名称必填,服务中心的应用名称可以不填
# 定义SpringBoot应用的名称,建议必须提供。在SpringCloud中,对服务的最大粒度的管理是使用应用命名的
# 最好是一个应用一个名称,在消费者角色开发的时候,比较容易查找Provider
spring.application.name=eureka-provider
server.port=8001
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
#配置Eureka Server的地址信息,如果是Eureka Server集群,多个节点使用逗号','分割。
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
#设置注册跳转地址
eureka.instance.status-page-url-path=/swagger-ui.html
6、服务提供者安全认证访问(如果注册中心中配置了认证访问)
defaultZone 格式http://用户名:密码@地址:端口/eureka/
#配置Eureka Server的地址信息,如果是Eureka Server集群,多个节点使用逗号','分割。
# 如果Eureka Server 中用了安全认证组件,需要使用安全认证语法。
#eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
eureka.client.service-url.defaultZone=http://liang:123456@localhost:8761/eureka/
Eureka 服务消费者配置
1、pom文件需要添加的依赖
<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>
<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、添加一个控制器调用执行消费
- 两种执行方法
一个是获取提供者实例结合(可能是一个)DiscoveryClient
一个是选择提供者实例 LoadBalancerClient
@RestController
public class IndexController {
@Autowired
private RestTemplate restTemplate;
@Bean
public RestTemplate restTemplate(){
return new RestTemplateBuilder().build();
}
@Autowired
DiscoveryClient discoveryClient;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/consumer/{id}")
private String getInfo(@PathVariable("id") int id){
// 由于查询到的服务列表是一个集合 可能是集合化部署 集合中每一项就是一个实例
List<ServiceInstance> provider = discoveryClient.getInstances("eureka-provider-01");
for(ServiceInstance serviceInstance : provider){
String host= serviceInstance.getHost();
Integer port= serviceInstance.getPort();
StringBuilder sb=new StringBuilder();
sb.append("http://");
sb.append(host);
sb.append(port);
sb.append("/student/get");
sb.append("/"+id);
System.out.println("格式拼接:"+sb.toString());
System.out.println(serviceInstance.toString());
String geturlInfo=restTemplate.getForObject(sb.toString(),String.class);
System.out.println("获取提供内容:"+geturlInfo);
}
return "执行ID:"+id;
}
@GetMapping("/consumer2/{id}")
private String getInfo2(@PathVariable("id") int id){
ServiceInstance serviceInstance= loadBalancerClient.choose("eureka-provider-01");
String host= serviceInstance.getHost();
Integer port= serviceInstance.getPort();
StringBuilder sb=new StringBuilder();
sb.append("http://");
sb.append(host);
sb.append(port);
sb.append("/student/get");
sb.append("/"+id);
System.out.println("格式拼接:"+sb.toString());
System.out.println(serviceInstance.toString());
String geturlInfo=restTemplate.getForObject(sb.toString(),String.class);
System.out.println("获取提供内容:"+geturlInfo);
return "执行ID:"+id;
}
}
3、application.properties中配置Eureka信息
消费者可以不注册到服务中心
spring.application.name=eureka-consumer
server.port=8080
# 消费者可以不注册到服务中心
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
#配置Eureka Server的地址信息,如果是Eureka Server集群,多个节点使用逗号','分割。
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
4、启动类添加@EnableDiscoveryClient 注解
@EnableDiscoveryClient
@SpringBootApplication
public class Springcloud03EurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(Springcloud03EurekaConsumerApplication.class, args);
}
}
5、消费者安全认证访问(如果注册中心中配置了认证访问)
defaultZone 格式http://用户名:密码@地址:端口/eureka/
#配置Eureka Server的地址信息,如果是Eureka Server集群,多个节点使用逗号','分割。
#eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
eureka.client.service-url.defaultZone=http://liang:123456@localhost:8761/eureka/
依次启动 注册中心、服务提供者、服务消费者。执行消费者中的方法。