Rumah > Java > javaTutorial > Bina sistem penerbangan perkhidmatan mikro Spring Cloud yang diedarkan dan selamat

Bina sistem penerbangan perkhidmatan mikro Spring Cloud yang diedarkan dan selamat

王林
Lepaskan: 2023-06-22 08:06:09
asal
880 orang telah melayarinya

Dengan pembangunan pengkomputeran awan dan pengembangan berterusan perniagaan perusahaan, seni bina perkhidmatan mikro telah menjadi seni bina sistem yang sangat popular. Antaranya, Spring Boot dan Spring Cloud merupakan rangka kerja mikroperkhidmatan yang paling biasa digunakan pada masa ini. Spring Cloud menyediakan banyak komponen untuk menyokong pembangunan dan pengurusan perkhidmatan mikro, termasuk pendaftaran dan penemuan perkhidmatan, penghalaan, pengimbangan beban, pengurusan konfigurasi, pemutus litar, dsb.

Dalam artikel ini, kami akan membina sistem terbang perkhidmatan mikro Spring Cloud yang diedarkan dan selamat sebagai satu kes untuk menunjukkan fungsi berkuasa Spring Cloud.

  1. Pendaftaran dan penemuan perkhidmatan

Pertama, kita perlu mendaftar dan menemui perkhidmatan. Spring Cloud menyediakan Eureka untuk membantu kami merealisasikan pendaftaran dan penemuan perkhidmatan. Kami akan melengkapkan pendaftaran dan penemuan perkhidmatan melalui Pelayan Eureka.

Buat aplikasi Eureka Server:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
Salin selepas log masuk

Konfigurasikan dalam application.properties:

server.port=8761

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
Salin selepas log masuk

Dalam penyedia perkhidmatan dan aplikasi pengguna perkhidmatan, kami perlu mendaftarkannya ke Eureka Server.

Dikonfigurasikan dalam aplikasi penyedia perkhidmatan.sifat:

spring.application.name=flight-service-provider
server.port=8080

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
Salin selepas log masuk

Dikonfigurasikan dalam aplikasi pengguna perkhidmatan.sifat:

spring.application.name=flight-service-consumer
server.port=8081

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
Salin selepas log masuk
  1. Komunikasi antara perkhidmatan

Pembekal perkhidmatan mencipta antara muka RESTful melalui Spring MVC:

@RestController
@RequestMapping("/flights")
public class FlightController {

    @GetMapping("/{flightId}")
    public ResponseEntity<Flight> getFlight(@PathVariable Integer flightId) {
        Flight flight = new Flight(flightId, "Shanghai", "Beijing", new Date());
        return new ResponseEntity<>(flight, HttpStatus.OK);
    }
}
Salin selepas log masuk

Pengguna perkhidmatan memanggil perkhidmatan melalui Spring RestTemplate:

@Service
public class FlightService {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${service.provider.url}")
    private String serviceProviderUrl;

    public Flight getFlight(Integer flightId) {
        return restTemplate.getForObject(serviceProviderUrl + "/flights/{flightId}", Flight.class, flightId);
    }
}
Salin selepas log masuk

Antaranya, service.provider.url terdapat dalam aplikasi Konfigurasi dalam aplikasi.sifat program.

  1. Pengimbangan Beban

Dalam aplikasi sebenar, pembekal perkhidmatan mungkin akan digunakan pada berbilang kejadian Dalam kes ini, kami perlu melakukan pengimbangan beban untuk meningkatkan prestasi prestasi dan ketersediaan. Spring Cloud menyediakan Ribbon untuk menyokong pengimbangan beban.

Konfigurasikan dalam aplikasi.sifat pengguna perkhidmatan:

service.provider.url=http://flight-service-provider/
spring.cloud.loadbalancer.ribbon.enabled=true
Salin selepas log masuk

Gunakan RestTemplate seimbang beban dalam FlightService:

@Service
public class FlightService {

    @Autowired
    @LoadBalanced
    private RestTemplate restTemplate;

    @Value("${service.provider.name}")
    private String serviceProviderName;

    public Flight getFlight(Integer flightId) {
        return restTemplate.getForObject("http://" + serviceProviderName + "/flights/{flightId}", Flight.class, flightId);
    }
}
Salin selepas log masuk

Di mana, service.provider.name terdapat dalam aplikasi Konfigurasi dalam aplikasi.sifat program.

  1. Pengurusan Konfigurasi

Spring Cloud menyediakan Config untuk mengurus konfigurasi aplikasi dengan mudah. Kami boleh menyimpan konfigurasi aplikasi dalam repositori Git dan mengedarkannya melalui Pelayan Konfig.

Buat aplikasi Pelayan Config:

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}
Salin selepas log masuk

Konfigurasi dalam aplikasi.sifat:

server.port=8888

spring.cloud.config.server.git.uri=https://github.com/xxx/xxx.git
spring.cloud.config.server.git.search-paths=config-repo
Salin selepas log masuk

Dalam penyedia perkhidmatan dan pengguna perkhidmatan, kami boleh mendapatkannya melalui konfigurasi Aplikasi Pelayan Konfig.

Konfigurasikan dalam aplikasi pembekal perkhidmatan.yml:

spring:
  application:
    name: flight-service-provider
  cloud:
    config:
      uri: http://localhost:8888
      label: master
      profile: dev
Salin selepas log masuk

Konfigurasikan dalam aplikasi pengguna perkhidmatan.yml:

spring:
  application:
    name: flight-service-consumer
  cloud:
    config:
      uri: http://localhost:8888
      label: master
      profile: dev
Salin selepas log masuk
  1. Pemutus litar

Dalam seni bina perkhidmatan mikro, kerana kebergantungan antara perkhidmatan adalah sangat kompleks, masa henti atau masalah dalam sesetengah perkhidmatan boleh menyebabkan keseluruhan sistem runtuh. Untuk menangani situasi ini, kita boleh menggunakan pemutus litar untuk mengendalikan kemerosotan perkhidmatan.

Spring Cloud menyediakan Hystrix untuk menyokong fungsi pemutus litar.

Konfigurasikan dalam application.yml pengguna perkhidmatan:

spring:
  application:
    name: flight-service-consumer
  cloud:
    config:
      uri: http://localhost:8888
      label: master
      profile: dev
  loadbalancer:
    ribbon:
      enabled: true
  circuitbreaker:
    enabled: true
    resilience4j:
      enabled: false
      circuitBreaker:
        backend: flight-service-provider
        failureRateThreshold: 50
Salin selepas log masuk

Tambah anotasi @HystrixCommand dalam FlightController:

@RestController
@RequestMapping("/flights")
public class FlightController {

    @Autowired
    private FlightService flightService;

    @GetMapping("/{flightId}")
    @HystrixCommand(fallbackMethod = "defaultGetFlight")
    public ResponseEntity<Flight> getFlight(@PathVariable Integer flightId) {
        Flight flight = flightService.getFlight(flightId);
        if (flight != null) {
            return new ResponseEntity<>(flight, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    public ResponseEntity<Flight> defaultGetFlight(Integer flightId) {
        return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
Salin selepas log masuk

Antaranya, defaultGetFlight ialah fungsi turun taraf.

  1. Keselamatan

Dalam sistem yang diedarkan, isu keselamatan adalah sangat penting. Spring Cloud menyediakan Keselamatan untuk menyokong pengurusan keselamatan.

Tambah dalam pom.xml penyedia perkhidmatan dan aplikasi pengguna perkhidmatan:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-security</artifactId>
</dependency>
Salin selepas log masuk

Konfigurasikan dalam application.yml penyedia perkhidmatan dan aplikasi pengguna perkhidmatan:

security:
  basic:
    enabled: true

spring:
  security:
    user:
      name: user
      password: password
Salin selepas log masuk

Antaranya, namakan dan kata laluan ialah nama pengguna dan kata laluan masing-masing. Perlu diingatkan bahawa dalam aplikasi sebenar, kaedah yang lebih selamat mesti digunakan untuk pengesahan pengguna dan pengurusan kebenaran.

Tambah anotasi @PreAuthorize pada peringkat kelas FlightController:

@RestController
@RequestMapping("/flights")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public class FlightController {

    @Autowired
    private FlightService flightService;

    @GetMapping("/{flightId}")
    public ResponseEntity<Flight> getFlight(@PathVariable Integer flightId) {
        Flight flight = flightService.getFlight(flightId);
        if (flight != null) {
            return new ResponseEntity<>(flight, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }
}
Salin selepas log masuk

Antaranya, anotasi @PreAuthorize digunakan untuk melaksanakan pengesahan keselamatan pada FlightController. Dalam aplikasi sebenar, pengesahan keselamatan yang berbeza boleh dilakukan pada setiap kaedah.

Dengan cara ini, kami telah menyelesaikan pembinaan sistem penerbangan mikro perkhidmatan Spring Cloud yang diedarkan dan selamat. Melalui kes dalam artikel ini, kita dapat melihat bahawa Spring Cloud menyediakan banyak komponen untuk membantu kami membina perkhidmatan mikro. Pada masa yang sama, kita juga perlu memberi perhatian kepada beberapa cabaran yang dibawa oleh seni bina perkhidmatan mikro, seperti pendaftaran dan penemuan perkhidmatan, komunikasi antara perkhidmatan, pengimbangan beban, pengurusan konfigurasi, pemutus litar, keselamatan dan isu-isu lain. Dalam aplikasi sebenar, kita perlu membuat pemilihan dan konfigurasi teknologi berdasarkan senario tertentu.

Atas ialah kandungan terperinci Bina sistem penerbangan perkhidmatan mikro Spring Cloud yang diedarkan dan selamat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan